library(ggplot2)
library(dplyr)
library(stats)

True value in set1, sim1

TrueValue_set1 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_1[1, 2])), ", ")[[1]]
#average <- mean(TrueValues_set1)
plot(TrueValue_set1, type = "l", pch = 16, col = "blue", main = "True Values in sim0", xlab = "Iteration", ylab = "Value")

#TrueValue_set1_sim0 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_1[1, 2])), ", ")[[1]]
#unlist(aggregated_results_1[1, 2])
#clean_str = gsub("\\[|\\]", "", TrueValue_sim0)
#TrueValue_set1_sim1 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_1[2, 2])), ", ")[[1]]

#print(Values)
#X <- 1:100
#plot(TrueValue_set1_sim0, type = "l", pch = 16, col = "blue", main = "True Values in sim0", xlab = "Iteration", ylab = "Value")
#plot(TrueValue_set1_sim1, type = "l", pch = 16, col = "blue", main = "True Values in sim1", xlab = "Iteration", ylab = "Value")

#fit <- lm(Values ~ X)
#abline(fit, col = "red")

True values in set 1, all sim

# Initialize an empty vector to store the True values
TrueValues_set1 <- numeric()

# Loop through each iteration (n)
for (n in 1:10) {
  # Extract True values from the aggregated_results_1 dataframe
  TrueValue_set1 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_1[n, 2])), ", ")[[1]]
  
  # Append the True values to the vector
  TrueValues_set1 <- c(TrueValues_set1, as.numeric(TrueValue_set1))
}

# Calculate the average of True values
average <- mean(TrueValues_set1)

# Plot the average
plot(TrueValues_set1, type = "l", pch = 16, col = "blue", main = "True Values in set 1", xlab = "Iteration", ylab = "Value")

# Add a horizontal line for the average
abline(h = average, col = "red", lwd = 2)

Expected value in set1, all sim

# Initialize an empty vector to store the True values
ExpectedValues_set1 <- numeric()

# Loop through each iteration (n)
for (n in 1:10) {
  # Extract True values from the aggregated_results_1 dataframe
  ExpectedValue_set1 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_1[n, 3])), ", ")[[1]]
  
  # Append the True values to the vector
  ExpectedValues_set1 <- c(ExpectedValues_set1, as.numeric(ExpectedValue_set1))
}

# Calculate the average of True values
average <- mean(ExpectedValues_set1)

# Plot the average
plot(ExpectedValues_set1, type = "l", pch = 16, col = "blue", main = "Expected Values in set 1", xlab = "Iteration", ylab = "Value")

# Add a horizontal line for the average
abline(h = average, col = "red", lwd = 2)

True and Expected Values in set 1

# Initialize empty vectors to store true and expected values
TrueValues_set1 <- numeric()
ExpectedValues_set1 <- numeric()

# Loop through each iteration (n)
for (n in 1:10) {
  # Extract True values from the aggregated_results_1 dataframe
  TrueValue_set1 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_1[n, 2])), ", ")[[1]]
  
  # Extract Expected values from the aggregated_results_1 dataframe
  ExpectedValue_set1 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_1[n, 3])), ", ")[[1]]
  
  # Append the True and Expected values to their respective vectors
  TrueValues_set1 <- c(TrueValues_set1, as.numeric(TrueValue_set1))
  ExpectedValues_set1 <- c(ExpectedValues_set1, as.numeric(ExpectedValue_set1))
}

# Calculate the average of True values
average_true <- mean(TrueValues_set1)

# Calculate the average of Expected values
average_expected <- mean(ExpectedValues_set1)

# Plot True and Expected values on the same plot
plot(TrueValues_set1, type = "l", pch = 16, col = "blue", main = "True vs Expected Values in set 1", xlab = "Iteration", ylab = "Value")
lines(ExpectedValues_set1, type = "l", pch = 16, col = "red")

# Add legend
legend("topright", legend = c("True Values", "Expected Values"), col = c("blue", "red"), lty = 1, cex = 0.8)

# Add horizontal lines for the averages
abline(h = average_true, col = "blue", lwd = 1)
abline(h = average_expected, col = "red", lwd = 1)

Bids in set1, sim1

Bids_set1 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_1[1, 4])), ", ")[[1]]
#average <- mean(TrueValues_set1)
plot(Bids_set1, type = "l", pch = 16, col = "blue", main = "True Values in sim0", xlab = "Iteration", ylab = "Value")

Bids in set 1, all sim

# Initialize an empty vector to store the True values
Bids_set1 <- numeric()

# Loop through each iteration (n)
for (n in 1:10) {
  # Extract True values from the aggregated_results_1 dataframe
  Bid_set1 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_1[n, 4])), ", ")[[1]]
  
  # Append the True values to the vector (corrected typo)
  Bids_set1 <- c(Bids_set1, as.numeric(Bid_set1))
}

# Check if the vector is properly populated
#print(Bids_set1)

# Calculate the average of True values
average <- mean(Bids_set1, na.rm = TRUE)

# Plot the values
plot(Bids_set1, type = "l", pch = 16, col = "blue", main = "Expected Values in set 1", xlab = "Iteration", ylab = "Value")

# Add a horizontal line for the average
abline(h = average, col = "red", lwd = 2)

Bids and Asks Overall

# Initialize empty vectors to store the Bid and Ask values
Bids_set1 <- numeric()
Asks_set1 <- numeric()

# Loop through each iteration (n)
for (n in 1:10) {
  # Extract Bid values from the aggregated_results_1 dataframe
  Bid_set1 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_1[n, 4])), ", ")[[1]]
  
  # Extract Ask values from the aggregated_results_1 dataframe (next column)
  Ask_set1 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_1[n, 5])), ", ")[[1]]
  
  # Append the Bid and Ask values to their respective vectors
  Bids_set1 <- c(Bids_set1, as.numeric(Bid_set1))
  Asks_set1 <- c(Asks_set1, as.numeric(Ask_set1))
}

# Calculate the average of Bid and Ask values
average_bids <- mean(Bids_set1, na.rm = TRUE)
average_asks <- mean(Asks_set1, na.rm = TRUE)

# Plot the Bid and Ask values on the same plot
plot(Bids_set1, type = "l", pch = 16, col = "blue", main = "Bids vs Asks in set 1", xlab = "Iteration", ylab = "Value")
lines(Asks_set1, type = "l", pch = 16, col = "red")

# Add legend
legend("topright", legend = c("Bids", "Asks"), col = c("blue", "red"), lty = 1, cex = 0.8)

# Add horizontal lines for the averages
abline(h = average_bids, col = "blue", lty = 1)
abline(h = average_asks, col = "red", lty = 1)

Start From Here

set 1 (6 informed)

# Initialize matrices to store averages for each position
average_true <- matrix(NA, nrow = 100, ncol = 10)
average_expected <- matrix(NA, nrow = 100, ncol = 10)

# Loop through each simulation (n)
for (n in 1:10) {
  # Extract True values from the aggregated_results_4 dataframe
  TrueValues_set1 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_1[n, 2])), ", ")
  
  # Extract Expected values from the aggregated_results_4 dataframe
  ExpectedValues_set51 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_1[n, 3])), ", ")
  
  # Loop through each position (i)
  for (i in 1:100) {
    # Extract True and Expected values for the i-th position
    True_values <- sapply(TrueValues_set5, function(x) as.numeric(x[i]))
    Expected_values <- sapply(ExpectedValues_set5, function(x) as.numeric(x[i]))
    
    # Calculate the average of True and Expected values for the i-th position
    average_true[i, n] <- mean(True_values, na.rm = TRUE)
    average_expected[i, n] <- mean(Expected_values, na.rm = TRUE)
  }
}

# Calculate the overall average for each position across all simulations
overall_average_true <- rowMeans(average_true, na.rm = TRUE)
overall_average_expected <- rowMeans(average_expected, na.rm = TRUE)

# Plot the overall averages
plot(overall_average_true, type = "l", pch = 16, col = "blue", main = "Overall Average of True vs Expected Values", xlab = "Position in List", ylab = "Value", ylim = c(min(c(overall_average_true, overall_average_expected)), max(c(overall_average_true, overall_average_expected))))
lines(overall_average_expected, type = "l", pch = 16, col = "red")
legend("topright", legend = c("True Values", "Expected Values"), col = c("blue", "red"), lty = 1, cex = 0.8)

# Initialize matrices to store averages for each position
average_bid <- matrix(NA, nrow = 100, ncol = 10)
average_ask <- matrix(NA, nrow = 100, ncol = 10)

# Loop through each simulation (n)
for (n in 1:10) {
  # Extract True values from the aggregated_results_4 dataframe
  Bids_set1 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_1[n, 4])), ", ")
  
  # Extract Expected values from the aggregated_results_4 dataframe
  Asks_set1 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_1[n, 5])), ", ")
  
  # Loop through each position (i)
  for (i in 1:100) {
    # Extract True and Expected values for the i-th position
    Bids <- sapply(Bids_set1, function(x) as.numeric(x[i]))
    Asks <- sapply(Asks_set1, function(x) as.numeric(x[i]))
    
    # Calculate the average of True and Expected values for the i-th position
    average_bid[i, n] <- mean(Bids, na.rm = TRUE)
    average_ask[i, n] <- mean(Asks, na.rm = TRUE)
  }
}

# Calculate the overall average for each position across all simulations
overall_average_bid <- rowMeans(average_bid, na.rm = TRUE)
overall_average_ask <- rowMeans(average_ask, na.rm = TRUE)

# Plot the overall averages
plot(overall_average_bid, type = "l", pch = 16, col = "blue", main = "Overall Average of Bids vs Asks", xlab = "Position in List", ylab = "Value", ylim = c(min(c(overall_average_bid, overall_average_ask)), max(c(overall_average_bid, overall_average_ask))))
lines(overall_average_ask, type = "l", pch = 16, col = "red")
legend("topright", legend = c("Bids", "Asks"), col = c("blue", "red"), lty = 1, cex = 0.8)

# Initialize matrices to store averages for each position
average_MM_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_Informed1_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_Informed2_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_Informed3_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_Informed4_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_Informed5_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_Informed6_pnl <- matrix(NA, nrow = 100, ncol = 10)

# Loop through each simulation (n)
for (n in 1:10) {

  MM_pnl_set1 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_1[n, 6])), ", ")

  Informed1_pnl_set1 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_1[n, 8])), ", ")
  
  Informed2_pnl_set1 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_1[n, 10])), ", ")
  
  Informed3_pnl_set1 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_1[n, 12])), ", ")
  
  Informed4_pnl_set1 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_1[n, 14])), ", ")
  
  Informed5_pnl_set1 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_1[n, 16])), ", ")
  
  Informed6_pnl_set1 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_1[n, 18])), ", ")
  
  # Loop through each position (i)
  for (i in 1:100) {
    # Extract True and Expected values for the i-th position
    MM_pnl <- sapply(MM_pnl_set1, function(x) as.numeric(x[i]))
    Informed1_pnl <- sapply(Informed1_pnl_set1, function(x) as.numeric(x[i]))
    Informed2_pnl <- sapply(Informed2_pnl_set1, function(x) as.numeric(x[i]))
    Informed3_pnl <- sapply(Informed3_pnl_set1, function(x) as.numeric(x[i]))
    Informed4_pnl <- sapply(Informed4_pnl_set1, function(x) as.numeric(x[i]))
    Informed5_pnl <- sapply(Informed5_pnl_set1, function(x) as.numeric(x[i]))
    Informed6_pnl <- sapply(Informed6_pnl_set1, function(x) as.numeric(x[i]))
    
    # Calculate the average of True and Expected values for the i-th position
    average_MM_pnl[i, n] <- mean(MM_pnl, na.rm = TRUE)
    average_Informed1_pnl[i, n] <- mean(Informed1_pnl, na.rm = TRUE)
    average_Informed2_pnl[i, n] <- mean(Informed2_pnl, na.rm = TRUE)
    average_Informed3_pnl[i, n] <- mean(Informed3_pnl, na.rm = TRUE)
    average_Informed4_pnl[i, n] <- mean(Informed4_pnl, na.rm = TRUE)
    average_Informed5_pnl[i, n] <- mean(Informed5_pnl, na.rm = TRUE)
    average_Informed6_pnl[i, n] <- mean(Informed6_pnl, na.rm = TRUE)
  }
}

# Calculate the overall average for each position across all simulations
overall_average_MM_pnl <- rowMeans(average_MM_pnl, na.rm = TRUE)
overall_average_Informed1_pnl <- rowMeans(average_Informed1_pnl, na.rm = TRUE)
overall_average_Informed2_pnl <- rowMeans(average_Informed2_pnl, na.rm = TRUE)
overall_average_Informed3_pnl <- rowMeans(average_Informed3_pnl, na.rm = TRUE)
overall_average_Informed4_pnl <- rowMeans(average_Informed4_pnl, na.rm = TRUE)
overall_average_Informed5_pnl <- rowMeans(average_Informed5_pnl, na.rm = TRUE)
overall_average_Informed6_pnl <- rowMeans(average_Informed6_pnl, na.rm = TRUE)

# Plot the overall averages
plot(overall_average_MM_pnl, type = "l", pch = 16, col = "black", main = "Overall Average PNL", xlab = "Position in List", ylab = "Value", ylim = c(min(c(overall_average_MM_pnl, overall_average_Informed1_pnl, overall_average_Informed2_pnl, overall_average_Informed3_pnl, overall_average_Informed4_pnl, overall_average_Informed5_pnl, overall_average_Informed6_pnl)), max(c(overall_average_MM_pnl, overall_average_Informed1_pnl, overall_average_Informed2_pnl, overall_average_Informed3_pnl, overall_average_Informed4_pnl, overall_average_Informed5_pnl, overall_average_Informed6_pnl))))
lines(overall_average_Informed1_pnl, type = "l", pch = 16, col = "red")
lines(overall_average_Informed2_pnl, type = "l", pch = 16, col = "green")
lines(overall_average_Informed3_pnl, type = "l", pch = 16, col = "yellow")
lines(overall_average_Informed4_pnl, type = "l", pch = 16, col = "blue")
lines(overall_average_Informed5_pnl, type = "l", pch = 16, col = "purple")
lines(overall_average_Informed6_pnl, type = "l", pch = 16, col = "orange")

# Add legend
legend("bottomleft", legend = c("Market Maker", "Informed 1", "Informed 2", "Informed 3", "Informed 4", "Informed 5", "Informed 6"), col = c("black", "red", "green", "yellow", "blue", "purple", "orange"), lty = 1, cex = 0.8)

# Initialize matrices to store averages for each position
average_MM_pos <- matrix(NA, nrow = 100, ncol = 10)
average_Informed1_pos <- matrix(NA, nrow = 100, ncol = 10)
average_Informed2_pos <- matrix(NA, nrow = 100, ncol = 10)
average_Informed3_pos <- matrix(NA, nrow = 100, ncol = 10)
average_Informed4_pos <- matrix(NA, nrow = 100, ncol = 10)
average_Informed5_pos <- matrix(NA, nrow = 100, ncol = 10)
average_Informed6_pos <- matrix(NA, nrow = 100, ncol = 10)

# Loop through each simulation (n)
for (n in 1:10) {

  MM_pos_set1 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_1[n, 7])), ", ")

  Informed1_pos_set1 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_1[n, 9])), ", ")
  
  Informed2_pos_set1 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_1[n, 11])), ", ")
  
  Informed3_pos_set1 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_1[n, 13])), ", ")
  
  Informed4_pos_set1 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_1[n, 15])), ", ")
  
  Informed5_pos_set1 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_1[n, 17])), ", ")
  
  Informed6_pos_set1 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_1[n, 19])), ", ")
  
  # Loop through each position (i)
  for (i in 1:100) {
    # Extract True and Expected values for the i-th position
    MM_pos <- sapply(MM_pos_set1, function(x) as.numeric(x[i]))
    Informed1_pos <- sapply(Informed1_pos_set1, function(x) as.numeric(x[i]))
    Informed2_pos <- sapply(Informed2_pos_set1, function(x) as.numeric(x[i]))
    Informed3_pos <- sapply(Informed3_pos_set1, function(x) as.numeric(x[i]))
    Informed4_pos <- sapply(Informed4_pos_set1, function(x) as.numeric(x[i]))
    Informed5_pos <- sapply(Informed5_pos_set1, function(x) as.numeric(x[i]))
    Informed6_pos <- sapply(Informed6_pos_set1, function(x) as.numeric(x[i]))
    
    # Calculate the average of True and Expected values for the i-th position
    average_MM_pos[i, n] <- mean(MM_pos, na.rm = TRUE)
    average_Informed1_pos[i, n] <- mean(Informed1_pos, na.rm = TRUE)
    average_Informed2_pos[i, n] <- mean(Informed2_pos, na.rm = TRUE)
    average_Informed3_pos[i, n] <- mean(Informed3_pos, na.rm = TRUE)
    average_Informed4_pos[i, n] <- mean(Informed4_pos, na.rm = TRUE)
    average_Informed5_pos[i, n] <- mean(Informed5_pos, na.rm = TRUE)
    average_Informed6_pos[i, n] <- mean(Informed6_pos, na.rm = TRUE)
  }
}

# Calculate the overall average for each position across all simulations
overall_average_MM_pos <- rowMeans(average_MM_pos, na.rm = TRUE)
overall_average_Informed1_pos <- rowMeans(average_Informed1_pos, na.rm = TRUE)
overall_average_Informed2_pos <- rowMeans(average_Informed2_pos, na.rm = TRUE)
overall_average_Informed3_pos <- rowMeans(average_Informed3_pos, na.rm = TRUE)
overall_average_Informed4_pos <- rowMeans(average_Informed4_pos, na.rm = TRUE)
overall_average_Informed5_pos <- rowMeans(average_Informed5_pos, na.rm = TRUE)
overall_average_Informed6_pos <- rowMeans(average_Informed6_pos, na.rm = TRUE)

# Plot the overall averages
plot(overall_average_MM_pos, type = "l", pch = 16, col = "black", main = "Overall Average Position", xlab = "Position in List", ylab = "Value", ylim = c(min(c(overall_average_MM_pos, overall_average_Informed1_pos, overall_average_Informed2_pos, overall_average_Informed3_pos, overall_average_Informed4_pos, overall_average_Informed5_pos, overall_average_Informed6_pos)), max(c(overall_average_MM_pos, overall_average_Informed1_pos, overall_average_Informed2_pos, overall_average_Informed3_pos, overall_average_Informed4_pos, overall_average_Informed5_pos, overall_average_Informed6_pos))))
lines(overall_average_Informed1_pos, type = "l", pch = 16, col = "red")
lines(overall_average_Informed2_pos, type = "l", pch = 16, col = "green")
lines(overall_average_Informed3_pos, type = "l", pch = 16, col = "yellow")
lines(overall_average_Informed4_pos, type = "l", pch = 16, col = "blue")
lines(overall_average_Informed5_pos, type = "l", pch = 16, col = "purple")
lines(overall_average_Informed6_pos, type = "l", pch = 16, col = "orange")

# Add legend
legend("bottomleft", legend = c("Market Maker", "Informed 1", "Informed 2", "Informed 3", "Informed 4", "Informed 5", "Informed 6"), col = c("black", "red", "green", "yellow", "blue", "purple", "orange"), lty = 1, cex = 0.8)

set 2

set 3

set 4 (1 informed + 2 noisy informed + 2 noisy + 1 stochastic noisy)

# Initialize empty vectors to store true and expected values
TrueValues_set4 <- numeric()
ExpectedValues_set4 <- numeric()

# Loop through each iteration (n)
for (n in 1:10) {
  # Extract True values from the aggregated_results_1 dataframe
  TrueValue_set4 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4[n, 2])), ", ")[[1]]
  
  # Extract Expected values from the aggregated_results_1 dataframe
  ExpectedValue_set4 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4[n, 3])), ", ")[[1]]
  
  # Append the True and Expected values to their respective vectors
  TrueValues_set4 <- c(TrueValues_set4, as.numeric(TrueValue_set4))
  ExpectedValues_set4 <- c(ExpectedValues_set4, as.numeric(ExpectedValue_set4))
}

# Calculate the average of True values
average_true <- mean(TrueValues_set4)

# Calculate the average of Expected values
average_expected <- mean(ExpectedValues_set4)

# Plot True and Expected values on the same plot
plot(TrueValues_set4, type = "l", pch = 16, col = "blue", main = "True vs Expected Values in set 4", xlab = "Iteration", ylab = "Value")
lines(ExpectedValues_set4, type = "l", pch = 16, col = "red")

# Add legend
legend("topright", legend = c("True Values", "Expected Values"), col = c("blue", "red"), lty = 1, cex = 0.8)

# Add horizontal lines for the averages
abline(h = average_true, col = "blue", lwd = 1)
abline(h = average_expected, col = "red", lwd = 1)

# Initialize matrices to store averages for each position
average_true <- matrix(NA, nrow = 100, ncol = 10)
average_expected <- matrix(NA, nrow = 100, ncol = 10)

# Loop through each simulation (n)
for (n in 1:10) {
  # Extract True values from the aggregated_results_4 dataframe
  TrueValues_set4 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4[n, 2])), ", ")
  
  # Extract Expected values from the aggregated_results_4 dataframe
  ExpectedValues_set4 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4[n, 3])), ", ")
  
  # Loop through each position (i)
  for (i in 1:100) {
    # Extract True and Expected values for the i-th position
    True_values <- sapply(TrueValues_set4, function(x) as.numeric(x[i]))
    Expected_values <- sapply(ExpectedValues_set4, function(x) as.numeric(x[i]))
    
    # Calculate the average of True and Expected values for the i-th position
    average_true[i, n] <- mean(True_values, na.rm = TRUE)
    average_expected[i, n] <- mean(Expected_values, na.rm = TRUE)
  }
}

# Calculate the overall average for each position across all simulations
overall_average_true <- rowMeans(average_true, na.rm = TRUE)
overall_average_expected <- rowMeans(average_expected, na.rm = TRUE)

# Plot the overall averages
plot(overall_average_true, type = "l", pch = 16, col = "blue", main = "Overall Average of True vs Expected Values", xlab = "Position in List", ylab = "Value", ylim = c(min(c(overall_average_true, overall_average_expected)), max(c(overall_average_true, overall_average_expected))))
lines(overall_average_expected, type = "l", pch = 16, col = "red")
legend("topright", legend = c("True Values", "Expected Values"), col = c("blue", "red"), lty = 1, cex = 0.8)

# Initialize empty vectors to store the Bid and Ask values
Bids_set4 <- numeric()
Asks_set4 <- numeric()

# Loop through each iteration (n)
for (n in 1:10) {
  # Extract Bid values from the aggregated_results_1 dataframe
  Bid_set4 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4[n, 4])), ", ")[[1]]
  
  # Extract Ask values from the aggregated_results_1 dataframe (next column)
  Ask_set4 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4[n, 5])), ", ")[[1]]
  
  # Append the Bid and Ask values to their respective vectors
  Bids_set4 <- c(Bids_set4, as.numeric(Bid_set4))
  Asks_set4 <- c(Asks_set4, as.numeric(Ask_set4))
}

# Calculate the average of Bid and Ask values
average_bids <- mean(Bids_set4, na.rm = TRUE)
average_asks <- mean(Asks_set4, na.rm = TRUE)

# Plot the Bid and Ask values on the same plot
plot(Bids_set4, type = "l", pch = 16, col = "blue", main = "Bids vs Asks in set 4", xlab = "Iteration", ylab = "Value", ylim = c(min(c(Bids_set4, Asks_set4)), max(c(Bids_set4, Asks_set4))))
lines(Asks_set4, type = "l", pch = 16, col = "red")

# Add legend
legend("topright", legend = c("Bids", "Asks"), col = c("blue", "red"), lty = 1, cex = 0.8)

# Add horizontal lines for the averages
abline(h = average_bids, col = "blue", lty = 1)
abline(h = average_asks, col = "red", lty = 1)

# Initialize matrices to store averages for each position
average_bid <- matrix(NA, nrow = 100, ncol = 10)
average_ask <- matrix(NA, nrow = 100, ncol = 10)

# Loop through each simulation (n)
for (n in 1:10) {
  # Extract True values from the aggregated_results_4 dataframe
  Bids_set4 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4[n, 4])), ", ")
  
  # Extract Expected values from the aggregated_results_4 dataframe
  Asks_set4 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4[n, 5])), ", ")
  
  # Loop through each position (i)
  for (i in 1:100) {
    # Extract True and Expected values for the i-th position
    Bids <- sapply(Bids_set4, function(x) as.numeric(x[i]))
    Asks <- sapply(Asks_set4, function(x) as.numeric(x[i]))
    
    # Calculate the average of True and Expected values for the i-th position
    average_bid[i, n] <- mean(Bids, na.rm = TRUE)
    average_ask[i, n] <- mean(Asks, na.rm = TRUE)
  }
}

# Calculate the overall average for each position across all simulations
overall_average_bid <- rowMeans(average_bid, na.rm = TRUE)
overall_average_ask <- rowMeans(average_ask, na.rm = TRUE)

# Plot the overall averages
plot(overall_average_bid, type = "l", pch = 16, col = "blue", main = "Overall Average of Bids vs Asks", xlab = "Position in List", ylab = "Value", ylim = c(min(c(overall_average_bid, overall_average_ask)), max(c(overall_average_bid, overall_average_ask))))
lines(overall_average_ask, type = "l", pch = 16, col = "red")
legend("topright", legend = c("Bids", "Asks"), col = c("blue", "red"), lty = 1, cex = 0.8)

# Initialize empty vectors to store the Bid and Ask values
MM_pnl_set4 <- numeric()
Informed_pnl_set4 <- numeric()
NoisyInformed1_pnl_set4 <- numeric()
NoisyInformed2_pnl_set4 <- numeric()
Noisy1_pnl_set4 <- numeric()
Noisy2_pnl_set4 <- numeric()
StochNoisy_pnl_set4 <- numeric()

# Loop through each iteration (n)
for (n in 1:10) {

  MM_pnl_values <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4[n, 6])), ", ")[[1]]
  
  Informed_pnl_values <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4[n, 8])), ", ")[[1]]
  
  NoisyInformed1_pnl_values <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4[n, 10])), ", ")[[1]]
  
  NoisyInformed2_pnl_values <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4[n, 12])), ", ")[[1]]
  
  Noisy1_pnl_values <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4[n, 14])), ", ")[[1]]
  
  Noisy2_pnl_values <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4[n, 16])), ", ")[[1]]
  
  StochNoisy_pnl_values <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4[n, 18])), ", ")[[1]]
  
  # Convert Bid and Ask values to numeric and append to the vectors
  MM_pnl_set4 <- c(MM_pnl_set4, as.numeric(MM_pnl_values))
  Informed_pnl_set4 <- c(Informed_pnl_set4, as.numeric(Informed_pnl_values))
  NoisyInformed1_pnl_set4 <- c(NoisyInformed1_pnl_set4, as.numeric(NoisyInformed1_pnl_values))
  NoisyInformed2_pnl_set4 <- c(NoisyInformed2_pnl_set4, as.numeric(NoisyInformed2_pnl_values))
  Noisy1_pnl_set4 <- c(Noisy_pnl_set4, as.numeric(Noisy1_pnl_values))
  Noisy2_pnl_set4 <- c(Noisy2_pnl_set4, as.numeric(Noisy2_pnl_values))
  StochNoisy_pnl_set4 <- c(StochNoisy_pnl_set4, as.numeric(StochNoisy_pnl_values))
}

# Calculate the average of Bid and Ask values
#average_MM <- mean(MM_set4, na.rm = TRUE)
#average_IN <- mean(IN_set4, na.rm = TRUE)

# Plot the Bid and Ask values on the same plot
plot(MM_pnl_set4, type = "l", pch = 16, col = "black", main = "PNL in set 4", xlab = "Iteration", ylab = "Value", ylim = c(min(c(MM_pnl_set4, Informed_pnl_set4, NoisyInformed1_pnl_set4, NoisyInformed2_pnl_set4, Noisy1_pnl_set4, Noisy2_pnl_set4, StochNoisy_pnl_set4)), max(c(MM_pnl_set4, Informed_pnl_set4, NoisyInformed1_pnl_set4, NoisyInformed2_pnl_set4, Noisy1_pnl_set4, Noisy2_pnl_set4, StochNoisy_pnl_set4))))
lines(Informed_pnl_set4, type = "l", pch = 16, col = "red")
lines(NoisyInformed1_pnl_set4, type = "l", pch = 16, col = "green")
lines(NoisyInformed2_pnl_set4, type = "l", pch = 16, col = "yellow")
lines(Noisy1_pnl_set4, type = "l", pch = 16, col = "blue")
lines(Noisy2_pnl_set4, type = "l", pch = 16, col = "purple")
lines(StochNoisy_pnl_set4, type = "l", pch = 16, col = "orange")


# Add legend
legend("bottomright", legend = c("Market Maker", "Informed", "Noisy Informed 1", "Noisy Informed 2", "Noisy 1", "Noisy 2", "Stochastic Noisy"), col = c("black", "red", "green", "yellow", "blue", "purple", "orange"), lty = 1, cex = 0.8)


# Add horizontal lines for the averages
#abline(h = average_MM, col = "blue", lty = 1)
#abline(h = average_IN, col = "red", lty = 1)
# Initialize matrices to store averages for each position
average_MM_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_Informed_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_NoisyInformed1_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_NoisyInformed2_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_Noisy1_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_Noisy2_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_StochNoisy_pnl <- matrix(NA, nrow = 100, ncol = 10)

# Loop through each simulation (n)
for (n in 1:10) {

  MM_pnl_set4 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4[n, 6])), ", ")

  Informed_pnl_set4 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4[n, 8])), ", ")
  
  NoisyInformed1_pnl_set4 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4[n, 10])), ", ")
  
  NoisyInformed2_pnl_set4 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4[n, 12])), ", ")
  
  Noisy1_pnl_set4 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4[n, 14])), ", ")
  
  Noisy2_pnl_set4 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4[n, 16])), ", ")
  
  StochNoisy_pnl_set4 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4[n, 18])), ", ")
  
  # Loop through each position (i)
  for (i in 1:100) {
    # Extract True and Expected values for the i-th position
    MM_pnl <- sapply(MM_pnl_set4, function(x) as.numeric(x[i]))
    Informed_pnl <- sapply(Informed_pnl_set4, function(x) as.numeric(x[i]))
    NoisyInformed1_pnl <- sapply(NoisyInformed1_pnl_set4, function(x) as.numeric(x[i]))
    NoisyInformed2_pnl <- sapply(NoisyInformed2_pnl_set4, function(x) as.numeric(x[i]))
    Noisy1_pnl <- sapply(Noisy1_pnl_set4, function(x) as.numeric(x[i]))
    Noisy2_pnl <- sapply(Noisy2_pnl_set4, function(x) as.numeric(x[i]))
    StochNoisy_pnl <- sapply(StochNoisy_pnl_set4, function(x) as.numeric(x[i]))
    
    # Calculate the average of True and Expected values for the i-th position
    average_MM_pnl[i, n] <- mean(MM_pnl, na.rm = TRUE)
    average_Informed_pnl[i, n] <- mean(Informed_pnl, na.rm = TRUE)
    average_NoisyInformed1_pnl[i, n] <- mean(NoisyInformed1_pnl, na.rm = TRUE)
    average_NoisyInformed2_pnl[i, n] <- mean(NoisyInformed2_pnl, na.rm = TRUE)
    average_Noisy1_pnl[i, n] <- mean(Noisy1_pnl, na.rm = TRUE)
    average_Noisy2_pnl[i, n] <- mean(Noisy2_pnl, na.rm = TRUE)
    average_StochNoisy_pnl[i, n] <- mean(StochNoisy_pnl, na.rm = TRUE)
  }
}

# Calculate the overall average for each position across all simulations
overall_average_MM_pnl <- rowMeans(average_MM_pnl, na.rm = TRUE)
overall_average_Informed_pnl <- rowMeans(average_Informed_pnl, na.rm = TRUE)
overall_average_NoisyInformed1_pnl <- rowMeans(average_NoisyInformed1_pnl, na.rm = TRUE)
overall_average_NoisyInformed2_pnl <- rowMeans(average_NoisyInformed2_pnl, na.rm = TRUE)
overall_average_Noisy1_pnl <- rowMeans(average_Noisy1_pnl, na.rm = TRUE)
overall_average_Noisy2_pnl <- rowMeans(average_Noisy2_pnl, na.rm = TRUE)
overall_average_StochNoisy_pnl <- rowMeans(average_StochNoisy_pnl, na.rm = TRUE)

# Plot the overall averages
plot(overall_average_MM_pnl, type = "l", pch = 16, col = "black", main = "Overall Average PNL", xlab = "Position in List", ylab = "Value", ylim = c(min(c(overall_average_MM_pnl, overall_average_Informed_pnl, overall_average_NoisyInformed1_pnl, overall_average_NoisyInformed2_pnl, overall_average_Noisy1_pnl, overall_average_Noisy2_pnl, overall_average_StochNoisy_pnl)), max(c(overall_average_MM_pnl, overall_average_Informed_pnl, overall_average_NoisyInformed1_pnl, overall_average_NoisyInformed2_pnl, overall_average_Noisy1_pnl, overall_average_Noisy2_pnl, overall_average_StochNoisy_pnl))))
lines(overall_average_Informed_pnl, type = "l", pch = 16, col = "red")
lines(overall_average_NoisyInformed1_pnl, type = "l", pch = 16, col = "green")
lines(overall_average_NoisyInformed2_pnl, type = "l", pch = 16, col = "yellow")
lines(overall_average_Noisy1_pnl, type = "l", pch = 16, col = "blue")
lines(overall_average_Noisy2_pnl, type = "l", pch = 16, col = "purple")
lines(overall_average_StochNoisy_pnl, type = "l", pch = 16, col = "orange")

# Add legend
legend("bottomleft", legend = c("Market Maker", "Informed", "Noisy Informed 1", "Noisy Informed 2", "Noisy 1", "Noisy 2", "Stochastic Noisy"), col = c("black", "red", "green", "yellow", "blue", "purple", "orange"), lty = 1, cex = 0.8)

# Initialize empty vectors to store the Bid and Ask values
MM_pos_set4 <- numeric()
Informed_pos_set4 <- numeric()
NoisyInformed1_pos_set4 <- numeric()
NoisyInformed2_pos_set4 <- numeric()
Noisy1_pos_set4 <- numeric()
Noisy2_pos_set4 <- numeric()
StochNoisy_pos_set4 <- numeric()

# Loop through each iteration (n)
for (n in 1:10) {

  MM_pos_values <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4[n, 7])), ", ")[[1]]
  
  Informed_pos_values <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4[n, 9])), ", ")[[1]]
  
  NoisyInformed1_pos_values <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4[n, 11])), ", ")[[1]]
  
  NoisyInformed2_pos_values <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4[n, 13])), ", ")[[1]]
  
  Noisy1_pos_values <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4[n, 15])), ", ")[[1]]
  
  Noisy2_pos_values <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4[n, 17])), ", ")[[1]]
  
  StochNoisy_pos_values <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4[n, 19])), ", ")[[1]]
  
  # Convert Bid and Ask values to numeric and append to the vectors
  MM_pos_set4 <- c(MM_pos_set4, as.numeric(MM_pos_values))
  Informed_pos_set4 <- c(Informed_pos_set4, as.numeric(Informed_pos_values))
  NoisyInformed1_pos_set4 <- c(NoisyInformed1_pos_set4, as.numeric(NoisyInformed1_pos_values))
  NoisyInformed2_pos_set4 <- c(NoisyInformed2_pos_set4, as.numeric(NoisyInformed2_pos_values))
  Noisy1_pos_set4 <- c(Noisy_pos_set4, as.numeric(Noisy1_pos_values))
  Noisy2_pos_set4 <- c(Noisy2_pos_set4, as.numeric(Noisy2_pos_values))
  StochNoisy_pos_set4 <- c(StochNoisy_pos_set4, as.numeric(StochNoisy_pos_values))
}

# Calculate the average of Bid and Ask values
#average_MM <- mean(MM_set4, na.rm = TRUE)
#average_IN <- mean(IN_set4, na.rm = TRUE)

# Plot the Bid and Ask values on the same plot
plot(MM_pos_set4, type = "l", pch = 16, col = "black", main = "Position in set 4", xlab = "Iteration", ylab = "Value", ylim = c(min(c(MM_pos_set4, Informed_pos_set4, NoisyInformed1_pos_set4, NoisyInformed2_pos_set4, Noisy1_pos_set4, Noisy2_pos_set4, StochNoisy_pos_set4)), max(c(MM_pos_set4, Informed_pos_set4, NoisyInformed1_pos_set4, NoisyInformed2_pos_set4, Noisy1_pos_set4, Noisy2_pos_set4, StochNoisy_pos_set4))))
lines(Informed_pos_set4, type = "l", pch = 16, col = "red")
lines(NoisyInformed1_pos_set4, type = "l", pch = 16, col = "green")
lines(NoisyInformed2_pos_set4, type = "l", pch = 16, col = "yellow")
lines(Noisy1_pos_set4, type = "l", pch = 16, col = "blue")
lines(Noisy2_pos_set4, type = "l", pch = 16, col = "purple")
lines(StochNoisy_pos_set4, type = "l", pch = 16, col = "orange")


# Add legend
legend("topleft", legend = c("Market Maker", "Informed", "Noisy Informed 1", "Noisy Informed 2", "Noisy 1", "Noisy 2", "Stochastic Noisy"), col = c("black", "red", "green", "yellow", "blue", "purple", "orange"), lty = 1, cex = 0.8)


# Add horizontal lines for the averages
#abline(h = average_MM, col = "blue", lty = 1)
#abline(h = average_IN, col = "red", lty = 1)
# Initialize matrices to store averages for each position
average_MM_pos <- matrix(NA, nrow = 100, ncol = 10)
average_Informed_pos <- matrix(NA, nrow = 100, ncol = 10)
average_NoisyInformed1_pos <- matrix(NA, nrow = 100, ncol = 10)
average_NoisyInformed2_pos <- matrix(NA, nrow = 100, ncol = 10)
average_Noisy1_pos <- matrix(NA, nrow = 100, ncol = 10)
average_Noisy2_pos <- matrix(NA, nrow = 100, ncol = 10)
average_StochNoisy_pos <- matrix(NA, nrow = 100, ncol = 10)

# Loop through each simulation (n)
for (n in 1:10) {

  MM_pos_set4 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4[n, 7])), ", ")

  Informed_pos_set4 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4[n, 9])), ", ")
  
  NoisyInformed1_pos_set4 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4[n, 11])), ", ")
  
  NoisyInformed2_pos_set4 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4[n, 13])), ", ")
  
  Noisy1_pos_set4 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4[n, 15])), ", ")
  
  Noisy2_pos_set4 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4[n, 17])), ", ")
  
  StochNoisy_pos_set4 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4[n, 19])), ", ")
  
  # Loop through each position (i)
  for (i in 1:100) {
    # Extract True and Expected values for the i-th position
    MM_pos <- sapply(MM_pos_set4, function(x) as.numeric(x[i]))
    Informed_pos <- sapply(Informed_pos_set4, function(x) as.numeric(x[i]))
    NoisyInformed1_pos <- sapply(NoisyInformed1_pos_set4, function(x) as.numeric(x[i]))
    NoisyInformed2_pos <- sapply(NoisyInformed2_pos_set4, function(x) as.numeric(x[i]))
    Noisy1_pos <- sapply(Noisy1_pos_set4, function(x) as.numeric(x[i]))
    Noisy2_pos <- sapply(Noisy2_pos_set4, function(x) as.numeric(x[i]))
    StochNoisy_pos <- sapply(StochNoisy_pos_set4, function(x) as.numeric(x[i]))
    
    # Calculate the average of True and Expected values for the i-th position
    average_MM_pos[i, n] <- mean(MM_pos, na.rm = TRUE)
    average_Informed_pos[i, n] <- mean(Informed_pos, na.rm = TRUE)
    average_NoisyInformed1_pos[i, n] <- mean(NoisyInformed1_pos, na.rm = TRUE)
    average_NoisyInformed2_pos[i, n] <- mean(NoisyInformed2_pos, na.rm = TRUE)
    average_Noisy1_pos[i, n] <- mean(Noisy1_pos, na.rm = TRUE)
    average_Noisy2_pos[i, n] <- mean(Noisy2_pos, na.rm = TRUE)
    average_StochNoisy_pos[i, n] <- mean(StochNoisy_pos, na.rm = TRUE)
  }
}

# Calculate the overall average for each position across all simulations
overall_average_MM_pos <- rowMeans(average_MM_pos, na.rm = TRUE)
overall_average_Informed_pos <- rowMeans(average_Informed_pos, na.rm = TRUE)
overall_average_NoisyInformed1_pos <- rowMeans(average_NoisyInformed1_pos, na.rm = TRUE)
overall_average_NoisyInformed2_pos <- rowMeans(average_NoisyInformed2_pos, na.rm = TRUE)
overall_average_Noisy1_pos <- rowMeans(average_Noisy1_pos, na.rm = TRUE)
overall_average_Noisy2_pos <- rowMeans(average_Noisy2_pos, na.rm = TRUE)
overall_average_StochNoisy_pos <- rowMeans(average_StochNoisy_pos, na.rm = TRUE)

# Plot the overall averages
plot(overall_average_MM_pos, type = "l", pch = 16, col = "black", main = "Overall Average Position", xlab = "Position in List", ylab = "Value", ylim = c(min(c(overall_average_MM_pos, overall_average_Informed_pos, overall_average_NoisyInformed1_pos, overall_average_NoisyInformed2_pos, overall_average_Noisy1_pos, overall_average_Noisy2_pos, overall_average_StochNoisy_pos)), max(c(overall_average_MM_pos, overall_average_Informed_pos, overall_average_NoisyInformed1_pos, overall_average_NoisyInformed2_pos, overall_average_Noisy1_pos, overall_average_Noisy2_pos, overall_average_StochNoisy_pos))))
lines(overall_average_Informed_pos, type = "l", pch = 16, col = "red")
lines(overall_average_NoisyInformed1_pos, type = "l", pch = 16, col = "green")
lines(overall_average_NoisyInformed2_pos, type = "l", pch = 16, col = "yellow")
lines(overall_average_Noisy1_pos, type = "l", pch = 16, col = "blue")
lines(overall_average_Noisy2_pos, type = "l", pch = 16, col = "purple")
lines(overall_average_StochNoisy_pos, type = "l", pch = 16, col = "orange")

# Add legend
legend("bottomleft", legend = c("Market Maker", "Informed", "Noisy Informed 1", "Noisy Informed 2", "Noisy 1", "Noisy 2", "Stochastic Noisy"), col = c("black", "red", "green", "yellow", "blue", "purple", "orange"), lty = 1, cex = 0.8)

set 5 (Noisy*6)

# Initialize matrices to store averages for each position
average_true <- matrix(NA, nrow = 100, ncol = 10)
average_expected <- matrix(NA, nrow = 100, ncol = 10)

# Loop through each simulation (n)
for (n in 1:10) {
  # Extract True values from the aggregated_results_4 dataframe
  TrueValues_set5 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_5[n, 2])), ", ")
  
  # Extract Expected values from the aggregated_results_4 dataframe
  ExpectedValues_set5 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_4[n, 3])), ", ")
  
  # Loop through each position (i)
  for (i in 1:100) {
    # Extract True and Expected values for the i-th position
    True_values <- sapply(TrueValues_set5, function(x) as.numeric(x[i]))
    Expected_values <- sapply(ExpectedValues_set5, function(x) as.numeric(x[i]))
    
    # Calculate the average of True and Expected values for the i-th position
    average_true[i, n] <- mean(True_values, na.rm = TRUE)
    average_expected[i, n] <- mean(Expected_values, na.rm = TRUE)
  }
}

# Calculate the overall average for each position across all simulations
overall_average_true <- rowMeans(average_true, na.rm = TRUE)
overall_average_expected <- rowMeans(average_expected, na.rm = TRUE)

# Plot the overall averages
plot(overall_average_true, type = "l", pch = 16, col = "blue", main = "Overall Average of True vs Expected Values", xlab = "Position in List", ylab = "Value", ylim = c(min(c(overall_average_true, overall_average_expected)), max(c(overall_average_true, overall_average_expected))))
lines(overall_average_expected, type = "l", pch = 16, col = "red")
legend("topright", legend = c("True Values", "Expected Values"), col = c("blue", "red"), lty = 1, cex = 0.8)

# Initialize matrices to store averages for each position
average_bid <- matrix(NA, nrow = 100, ncol = 10)
average_ask <- matrix(NA, nrow = 100, ncol = 10)

# Loop through each simulation (n)
for (n in 1:10) {
  # Extract True values from the aggregated_results_4 dataframe
  Bids_set5 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_5[n, 4])), ", ")
  
  # Extract Expected values from the aggregated_results_4 dataframe
  Asks_set5 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_5[n, 5])), ", ")
  
  # Loop through each position (i)
  for (i in 1:100) {
    # Extract True and Expected values for the i-th position
    Bids <- sapply(Bids_set5, function(x) as.numeric(x[i]))
    Asks <- sapply(Asks_set5, function(x) as.numeric(x[i]))
    
    # Calculate the average of True and Expected values for the i-th position
    average_bid[i, n] <- mean(Bids, na.rm = TRUE)
    average_ask[i, n] <- mean(Asks, na.rm = TRUE)
  }
}

# Calculate the overall average for each position across all simulations
overall_average_bid <- rowMeans(average_bid, na.rm = TRUE)
overall_average_ask <- rowMeans(average_ask, na.rm = TRUE)

# Plot the overall averages
plot(overall_average_bid, type = "l", pch = 16, col = "blue", main = "Overall Average of Bids vs Asks", xlab = "Position in List", ylab = "Value", ylim = c(min(c(overall_average_bid, overall_average_ask)), max(c(overall_average_bid, overall_average_ask))))
lines(overall_average_ask, type = "l", pch = 16, col = "red")
legend("topright", legend = c("Bids", "Asks"), col = c("blue", "red"), lty = 1, cex = 0.8)

# Initialize matrices to store averages for each position
average_MM_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_Noisy1_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_Noisy2_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_Noisy3_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_Noisy4_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_Noisy5_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_Noisy6_pnl <- matrix(NA, nrow = 100, ncol = 10)

# Loop through each simulation (n)
for (n in 1:10) {

  MM_pnl_set5 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_5[n, 6])), ", ")

  Noisy1_pnl_set5 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_5[n, 8])), ", ")
  
  Noisy2_pnl_set5 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_5[n, 10])), ", ")
  
  Noisy3_pnl_set5 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_5[n, 12])), ", ")
  
  Noisy4_pnl_set5 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_5[n, 14])), ", ")
  
  Noisy5_pnl_set5 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_5[n, 16])), ", ")
  
  Noisy6_pnl_set5 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_5[n, 18])), ", ")
  
  # Loop through each position (i)
  for (i in 1:100) {
    # Extract True and Expected values for the i-th position
    MM_pnl <- sapply(MM_pnl_set5, function(x) as.numeric(x[i]))
    Noisy1_pnl <- sapply(Noisy1_pnl_set5, function(x) as.numeric(x[i]))
    Noisy2_pnl <- sapply(Noisy2_pnl_set5, function(x) as.numeric(x[i]))
    Noisy3_pnl <- sapply(Noisy3_pnl_set5, function(x) as.numeric(x[i]))
    Noisy4_pnl <- sapply(Noisy4_pnl_set5, function(x) as.numeric(x[i]))
    Noisy5_pnl <- sapply(Noisy5_pnl_set5, function(x) as.numeric(x[i]))
    Noisy6_pnl <- sapply(Noisy6_pnl_set5, function(x) as.numeric(x[i]))
    
    # Calculate the average of True and Expected values for the i-th position
    average_MM_pnl[i, n] <- mean(MM_pnl, na.rm = TRUE)
    average_Noisy1_pnl[i, n] <- mean(Noisy1_pnl, na.rm = TRUE)
    average_Noisy2_pnl[i, n] <- mean(Noisy2_pnl, na.rm = TRUE)
    average_Noisy3_pnl[i, n] <- mean(Noisy3_pnl, na.rm = TRUE)
    average_Noisy4_pnl[i, n] <- mean(Noisy4_pnl, na.rm = TRUE)
    average_Noisy5_pnl[i, n] <- mean(Noisy5_pnl, na.rm = TRUE)
    average_Noisy6_pnl[i, n] <- mean(Noisy6_pnl, na.rm = TRUE)
  }
}

# Calculate the overall average for each position across all simulations
overall_average_MM_pnl <- rowMeans(average_MM_pnl, na.rm = TRUE)
overall_average_Noisy1_pnl <- rowMeans(average_Noisy1_pnl, na.rm = TRUE)
overall_average_Noisy2_pnl <- rowMeans(average_Noisy2_pnl, na.rm = TRUE)
overall_average_Noisy3_pnl <- rowMeans(average_Noisy3_pnl, na.rm = TRUE)
overall_average_Noisy4_pnl <- rowMeans(average_Noisy4_pnl, na.rm = TRUE)
overall_average_Noisy5_pnl <- rowMeans(average_Noisy5_pnl, na.rm = TRUE)
overall_average_Noisy6_pnl <- rowMeans(average_Noisy6_pnl, na.rm = TRUE)

# Plot the overall averages
plot(overall_average_MM_pnl, type = "l", pch = 16, col = "black", main = "Overall Average PNL", xlab = "Position in List", ylab = "Value", ylim = c(min(c(overall_average_MM_pnl, overall_average_Noisy1_pnl, overall_average_Noisy2_pnl, overall_average_Noisy3_pnl, overall_average_Noisy4_pnl, overall_average_Noisy5_pnl, overall_average_Noisy6_pnl)), max(c(overall_average_MM_pnl, overall_average_Noisy1_pnl, overall_average_Noisy2_pnl, overall_average_Noisy3_pnl, overall_average_Noisy4_pnl, overall_average_Noisy5_pnl, overall_average_Noisy6_pnl))))
lines(overall_average_Noisy1_pnl, type = "l", pch = 16, col = "red")
lines(overall_average_Noisy2_pnl, type = "l", pch = 16, col = "green")
lines(overall_average_Noisy3_pnl, type = "l", pch = 16, col = "yellow")
lines(overall_average_Noisy4_pnl, type = "l", pch = 16, col = "blue")
lines(overall_average_Noisy5_pnl, type = "l", pch = 16, col = "purple")
lines(overall_average_Noisy6_pnl, type = "l", pch = 16, col = "orange")

# Add legend
legend("bottomleft", legend = c("Market Maker", "Noisy 1", "Noisy 2", "Noisy 3", "Noisy 4", "Noisy 5", "Noisy 6"), col = c("black", "red", "green", "yellow", "blue", "purple", "orange"), lty = 1, cex = 0.8)

# Initialize matrices to store averages for each position
average_MM_pos <- matrix(NA, nrow = 100, ncol = 10)
average_Noisy1_pos <- matrix(NA, nrow = 100, ncol = 10)
average_Noisy2_pos <- matrix(NA, nrow = 100, ncol = 10)
average_Noisy3_pos <- matrix(NA, nrow = 100, ncol = 10)
average_Noisy4_pos <- matrix(NA, nrow = 100, ncol = 10)
average_Noisy5_pos <- matrix(NA, nrow = 100, ncol = 10)
average_Noisy6_pos <- matrix(NA, nrow = 100, ncol = 10)

# Loop through each simulation (n)
for (n in 1:10) {

  MM_pos_set5 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_5[n, 7])), ", ")

  Noisy1_pos_set5 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_5[n, 9])), ", ")
  
  Noisy2_pos_set5 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_5[n, 11])), ", ")
  
  Noisy3_pos_set5 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_5[n, 13])), ", ")
  
  Noisy4_pos_set5 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_5[n, 15])), ", ")
  
  Noisy5_pos_set5 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_5[n, 17])), ", ")
  
  Noisy6_pos_set5 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_5[n, 19])), ", ")
  
  # Loop through each position (i)
  for (i in 1:100) {
    # Extract True and Expected values for the i-th position
    MM_pos <- sapply(MM_pos_set5, function(x) as.numeric(x[i]))
    Noisy1_pos <- sapply(Noisy1_pos_set5, function(x) as.numeric(x[i]))
    Noisy2_pos <- sapply(Noisy2_pos_set5, function(x) as.numeric(x[i]))
    Noisy3_pos <- sapply(Noisy3_pos_set5, function(x) as.numeric(x[i]))
    Noisy4_pos <- sapply(Noisy4_pos_set5, function(x) as.numeric(x[i]))
    Noisy5_pos <- sapply(Noisy5_pos_set5, function(x) as.numeric(x[i]))
    Noisy6_pos <- sapply(Noisy6_pos_set5, function(x) as.numeric(x[i]))
    
    # Calculate the average of True and Expected values for the i-th position
    average_MM_pos[i, n] <- mean(MM_pos, na.rm = TRUE)
    average_Noisy1_pos[i, n] <- mean(Noisy1_pos, na.rm = TRUE)
    average_Noisy2_pos[i, n] <- mean(Noisy2_pos, na.rm = TRUE)
    average_Noisy3_pos[i, n] <- mean(Noisy3_pos, na.rm = TRUE)
    average_Noisy4_pos[i, n] <- mean(Noisy4_pos, na.rm = TRUE)
    average_Noisy5_pos[i, n] <- mean(Noisy5_pos, na.rm = TRUE)
    average_Noisy6_pos[i, n] <- mean(Noisy6_pos, na.rm = TRUE)
  }
}

# Calculate the overall average for each position across all simulations
overall_average_MM_pos <- rowMeans(average_MM_pos, na.rm = TRUE)
overall_average_Noisy1_pos <- rowMeans(average_Noisy1_pos, na.rm = TRUE)
overall_average_Noisy2_pos <- rowMeans(average_Noisy2_pos, na.rm = TRUE)
overall_average_Noisy3_pos <- rowMeans(average_Noisy3_pos, na.rm = TRUE)
overall_average_Noisy4_pos <- rowMeans(average_Noisy4_pos, na.rm = TRUE)
overall_average_Noisy5_pos <- rowMeans(average_Noisy5_pos, na.rm = TRUE)
overall_average_Noisy6_pos <- rowMeans(average_Noisy6_pos, na.rm = TRUE)

# Plot the overall averages
plot(overall_average_MM_pos, type = "l", pch = 16, col = "black", main = "Overall Average Position", xlab = "Position in List", ylab = "Value", ylim = c(min(c(overall_average_MM_pos, overall_average_Noisy1_pos, overall_average_Noisy2_pos, overall_average_Noisy3_pos, overall_average_Noisy4_pos, overall_average_Noisy5_pos, overall_average_Noisy6_pos)), max(c(overall_average_MM_pos, overall_average_Noisy1_pos, overall_average_Noisy2_pos, overall_average_Noisy3_pos, overall_average_Noisy4_pos, overall_average_Noisy5_pos, overall_average_Noisy6_pos))))
lines(overall_average_Noisy1_pos, type = "l", pch = 16, col = "red")
lines(overall_average_Noisy2_pos, type = "l", pch = 16, col = "green")
lines(overall_average_Noisy3_pos, type = "l", pch = 16, col = "yellow")
lines(overall_average_Noisy4_pos, type = "l", pch = 16, col = "blue")
lines(overall_average_Noisy5_pos, type = "l", pch = 16, col = "purple")
lines(overall_average_Noisy6_pos, type = "l", pch = 16, col = "orange")

# Add legend
legend("bottomright", legend = c("Market Maker", "Noisy 1", "Noisy 2", "Noisy 3", "Noisy 4", "Noisy 5", "Noisy 6"), col = c("black", "red", "green", "yellow", "blue", "purple", "orange"), lty = 1, cex = 0.8)

set6 (1 informed + 5 noisy)

# Initialize matrices to store averages for each position
average_true <- matrix(NA, nrow = 100, ncol = 10)
average_expected <- matrix(NA, nrow = 100, ncol = 10)

# Loop through each simulation (n)
for (n in 1:10) {
  # Extract True values from the aggregated_results_4 dataframe
  TrueValues_set6 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_6[n, 2])), ", ")
  
  # Extract Expected values from the aggregated_results_4 dataframe
  ExpectedValues_set6 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_6[n, 3])), ", ")
  
  # Loop through each position (i)
  for (i in 1:100) {
    # Extract True and Expected values for the i-th position
    True_values <- sapply(TrueValues_set6, function(x) as.numeric(x[i]))
    Expected_values <- sapply(ExpectedValues_set6, function(x) as.numeric(x[i]))
    
    # Calculate the average of True and Expected values for the i-th position
    average_true[i, n] <- mean(True_values, na.rm = TRUE)
    average_expected[i, n] <- mean(Expected_values, na.rm = TRUE)
  }
}

# Calculate the overall average for each position across all simulations
overall_average_true <- rowMeans(average_true, na.rm = TRUE)
overall_average_expected <- rowMeans(average_expected, na.rm = TRUE)

# Plot the overall averages
plot(overall_average_true, type = "l", pch = 16, col = "blue", main = "Overall Average of True vs Expected Values", xlab = "Position in List", ylab = "Value", ylim = c(min(c(overall_average_true, overall_average_expected)), max(c(overall_average_true, overall_average_expected))))
lines(overall_average_expected, type = "l", pch = 16, col = "red")
legend("topright", legend = c("True Values", "Expected Values"), col = c("blue", "red"), lty = 1, cex = 0.8)

# Initialize matrices to store averages for each position
average_bid <- matrix(NA, nrow = 100, ncol = 10)
average_ask <- matrix(NA, nrow = 100, ncol = 10)

# Loop through each simulation (n)
for (n in 1:10) {
  # Extract True values from the aggregated_results_4 dataframe
  Bids_set6 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_6[n, 4])), ", ")
  
  # Extract Expected values from the aggregated_results_4 dataframe
  Asks_set6 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_6[n, 5])), ", ")
  
  # Loop through each position (i)
  for (i in 1:100) {
    # Extract True and Expected values for the i-th position
    Bids <- sapply(Bids_set6, function(x) as.numeric(x[i]))
    Asks <- sapply(Asks_set6, function(x) as.numeric(x[i]))
    
    # Calculate the average of True and Expected values for the i-th position
    average_bid[i, n] <- mean(Bids, na.rm = TRUE)
    average_ask[i, n] <- mean(Asks, na.rm = TRUE)
  }
}

# Calculate the overall average for each position across all simulations
overall_average_bid <- rowMeans(average_bid, na.rm = TRUE)
overall_average_ask <- rowMeans(average_ask, na.rm = TRUE)

# Plot the overall averages
plot(overall_average_bid, type = "l", pch = 16, col = "blue", main = "Overall Average of Bids vs Asks", xlab = "Position in List", ylab = "Value", ylim = c(min(c(overall_average_bid, overall_average_ask)), max(c(overall_average_bid, overall_average_ask))))
lines(overall_average_ask, type = "l", pch = 16, col = "red")
legend("topright", legend = c("Bids", "Asks"), col = c("blue", "red"), lty = 1, cex = 0.8)

# Initialize matrices to store averages for each position
average_MM_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_Informed_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_Noisy1_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_Noisy2_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_Noisy3_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_Noisy4_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_Noisy5_pnl <- matrix(NA, nrow = 100, ncol = 10)

# Loop through each simulation (n)
for (n in 1:10) {

  MM_pnl_set6 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_6[n, 6])), ", ")

  Informed_pnl_set6 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_6[n, 8])), ", ")
  
  Noisy1_pnl_set6 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_6[n, 10])), ", ")
  
  Noisy2_pnl_set6 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_6[n, 12])), ", ")
  
  Noisy3_pnl_set6 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_6[n, 14])), ", ")
  
  Noisy4_pnl_set6 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_6[n, 16])), ", ")
  
  Noisy5_pnl_set6 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_6[n, 18])), ", ")
  
  # Loop through each position (i)
  for (i in 1:100) {
    # Extract True and Expected values for the i-th position
    MM_pnl <- sapply(MM_pnl_set6, function(x) as.numeric(x[i]))
    Informed_pnl <- sapply(Informed_pnl_set6, function(x) as.numeric(x[i]))
    Noisy1_pnl <- sapply(Noisy1_pnl_set6, function(x) as.numeric(x[i]))
    Noisy2_pnl <- sapply(Noisy2_pnl_set6, function(x) as.numeric(x[i]))
    Noisy3_pnl <- sapply(Noisy3_pnl_set6, function(x) as.numeric(x[i]))
    Noisy4_pnl <- sapply(Noisy4_pnl_set6, function(x) as.numeric(x[i]))
    Noisy5_pnl <- sapply(Noisy5_pnl_set6, function(x) as.numeric(x[i]))
    
    # Calculate the average of True and Expected values for the i-th position
    average_MM_pnl[i, n] <- mean(MM_pnl, na.rm = TRUE)
    average_Informed_pnl[i, n] <- mean(Informed_pnl, na.rm = TRUE)
    average_Noisy1_pnl[i, n] <- mean(Noisy1_pnl, na.rm = TRUE)
    average_Noisy2_pnl[i, n] <- mean(Noisy2_pnl, na.rm = TRUE)
    average_Noisy3_pnl[i, n] <- mean(Noisy3_pnl, na.rm = TRUE)
    average_Noisy4_pnl[i, n] <- mean(Noisy4_pnl, na.rm = TRUE)
    average_Noisy5_pnl[i, n] <- mean(Noisy5_pnl, na.rm = TRUE)
  }
}

# Calculate the overall average for each position across all simulations
overall_average_MM_pnl <- rowMeans(average_MM_pnl, na.rm = TRUE)
overall_average_Informed_pnl <- rowMeans(average_Informed_pnl, na.rm = TRUE)
overall_average_Noisy1_pnl <- rowMeans(average_Noisy1_pnl, na.rm = TRUE)
overall_average_Noisy2_pnl <- rowMeans(average_Noisy2_pnl, na.rm = TRUE)
overall_average_Noisy3_pnl <- rowMeans(average_Noisy3_pnl, na.rm = TRUE)
overall_average_Noisy4_pnl <- rowMeans(average_Noisy4_pnl, na.rm = TRUE)
overall_average_Noisy5_pnl <- rowMeans(average_Noisy5_pnl, na.rm = TRUE)

# Plot the overall averages
plot(overall_average_MM_pnl, type = "l", pch = 16, col = "black", main = "Overall Average PNL", xlab = "Position in List", ylab = "Value", ylim = c(min(c(overall_average_MM_pnl, overall_average_Informed_pnl, overall_average_Noisy1_pnl, overall_average_Noisy2_pnl, overall_average_Noisy3_pnl, overall_average_Noisy4_pnl, overall_average_Noisy5_pnl)), max(c(overall_average_MM_pnl, overall_average_Informed_pnl, overall_average_Noisy1_pnl, overall_average_Noisy2_pnl, overall_average_Noisy3_pnl, overall_average_Noisy4_pnl, overall_average_Noisy5_pnl))))
lines(overall_average_Informed_pnl, type = "l", pch = 16, col = "red")
lines(overall_average_Noisy1_pnl, type = "l", pch = 16, col = "green")
lines(overall_average_Noisy2_pnl, type = "l", pch = 16, col = "yellow")
lines(overall_average_Noisy3_pnl, type = "l", pch = 16, col = "blue")
lines(overall_average_Noisy4_pnl, type = "l", pch = 16, col = "purple")
lines(overall_average_Noisy5_pnl, type = "l", pch = 16, col = "orange")

# Add legend
legend("bottomleft", legend = c("Market Maker", "Informed", "Noisy 1", "Noisy 2", "Noisy 3", "Noisy 4", "Noisy 5"), col = c("black", "red", "green", "yellow", "blue", "purple", "orange"), lty = 1, cex = 0.8)

# Initialize matrices to store averages for each position
average_MM_pos <- matrix(NA, nrow = 100, ncol = 10)
average_Informed_pos <- matrix(NA, nrow = 100, ncol = 10)
average_Noisy1_pos <- matrix(NA, nrow = 100, ncol = 10)
average_Noisy2_pos <- matrix(NA, nrow = 100, ncol = 10)
average_Noisy3_pos <- matrix(NA, nrow = 100, ncol = 10)
average_Noisy4_pos <- matrix(NA, nrow = 100, ncol = 10)
average_Noisy5_pos <- matrix(NA, nrow = 100, ncol = 10)

# Loop through each simulation (n)
for (n in 1:10) {

  MM_pos_set6 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_6[n, 7])), ", ")

  Informed_pos_set6 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_6[n, 9])), ", ")
  
  Noisy1_pos_set6 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_6[n, 11])), ", ")
  
  Noisy2_pos_set6 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_6[n, 13])), ", ")
  
  Noisy3_pos_set6 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_6[n, 15])), ", ")
  
  Noisy4_pos_set6 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_6[n, 17])), ", ")
  
  Noisy5_pos_set6 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_6[n, 19])), ", ")
  
  # Loop through each position (i)
  for (i in 1:100) {
    # Extract True and Expected values for the i-th position
    MM_pos <- sapply(MM_pos_set6, function(x) as.numeric(x[i]))
    Informed_pos <- sapply(Informed_pnl_set6, function(x) as.numeric(x[i]))
    Noisy1_pos <- sapply(Noisy1_pos_set6, function(x) as.numeric(x[i]))
    Noisy2_pos <- sapply(Noisy2_pos_set6, function(x) as.numeric(x[i]))
    Noisy3_pos <- sapply(Noisy3_pos_set6, function(x) as.numeric(x[i]))
    Noisy4_pos <- sapply(Noisy4_pos_set6, function(x) as.numeric(x[i]))
    Noisy5_pos <- sapply(Noisy5_pos_set6, function(x) as.numeric(x[i]))
    
    # Calculate the average of True and Expected values for the i-th position
    average_MM_pos[i, n] <- mean(MM_pos, na.rm = TRUE)
    average_Informed_pos[i, n] <- mean(Informed_pos, na.rm = TRUE)
    average_Noisy1_pos[i, n] <- mean(Noisy1_pos, na.rm = TRUE)
    average_Noisy2_pos[i, n] <- mean(Noisy2_pos, na.rm = TRUE)
    average_Noisy3_pos[i, n] <- mean(Noisy3_pos, na.rm = TRUE)
    average_Noisy4_pos[i, n] <- mean(Noisy4_pos, na.rm = TRUE)
    average_Noisy5_pos[i, n] <- mean(Noisy5_pos, na.rm = TRUE)
  }
}

# Calculate the overall average for each position across all simulations
overall_average_MM_pos <- rowMeans(average_MM_pos, na.rm = TRUE)
overall_average_Informed_pos <- rowMeans(average_Informed_pos, na.rm = TRUE)
overall_average_Noisy1_pos <- rowMeans(average_Noisy1_pos, na.rm = TRUE)
overall_average_Noisy2_pos <- rowMeans(average_Noisy2_pos, na.rm = TRUE)
overall_average_Noisy3_pos <- rowMeans(average_Noisy3_pos, na.rm = TRUE)
overall_average_Noisy4_pos <- rowMeans(average_Noisy4_pos, na.rm = TRUE)
overall_average_Noisy5_pos <- rowMeans(average_Noisy5_pos, na.rm = TRUE)

# Plot the overall averages
plot(overall_average_MM_pos, type = "l", pch = 16, col = "black", main = "Overall Average Position", xlab = "Position in List", ylab = "Value", ylim = c(min(c(overall_average_MM_pos, overall_average_Informed_pos, overall_average_Noisy1_pos, overall_average_Noisy2_pos, overall_average_Noisy3_pos, overall_average_Noisy4_pos, overall_average_Noisy5_pos)), max(c(overall_average_MM_pos, overall_average_Informed_pos, overall_average_Noisy1_pos, overall_average_Noisy2_pos, overall_average_Noisy3_pos, overall_average_Noisy4_pos, overall_average_Noisy5_pos))))
lines(overall_average_Informed_pos, type = "l", pch = 16, col = "red")
lines(overall_average_Noisy1_pos, type = "l", pch = 16, col = "green")
lines(overall_average_Noisy2_pos, type = "l", pch = 16, col = "yellow")
lines(overall_average_Noisy3_pos, type = "l", pch = 16, col = "blue")
lines(overall_average_Noisy4_pos, type = "l", pch = 16, col = "purple")
lines(overall_average_Noisy5_pos, type = "l", pch = 16, col = "orange")

# Add legend
legend("bottomleft", legend = c("Market Maker", "Informed", "Noisy 1", "Noisy 2", "Noisy 3", "Noisy 4", "Noisy 5"), col = c("black", "red", "green", "yellow", "blue", "purple", "orange"), lty = 1, cex = 0.8)

set7 (1 informed + 5 noisy informed)

# Initialize matrices to store averages for each position
average_true <- matrix(NA, nrow = 100, ncol = 10)
average_expected <- matrix(NA, nrow = 100, ncol = 10)

# Loop through each simulation (n)
for (n in 1:10) {
  # Extract True values from the aggregated_results_4 dataframe
  TrueValues_set7 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_7[n, 2])), ", ")
  
  # Extract Expected values from the aggregated_results_4 dataframe
  ExpectedValues_set7 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_7[n, 3])), ", ")
  
  # Loop through each position (i)
  for (i in 1:100) {
    # Extract True and Expected values for the i-th position
    True_values <- sapply(TrueValues_set7, function(x) as.numeric(x[i]))
    Expected_values <- sapply(ExpectedValues_set6, function(x) as.numeric(x[i]))
    
    # Calculate the average of True and Expected values for the i-th position
    average_true[i, n] <- mean(True_values, na.rm = TRUE)
    average_expected[i, n] <- mean(Expected_values, na.rm = TRUE)
  }
}

# Calculate the overall average for each position across all simulations
overall_average_true <- rowMeans(average_true, na.rm = TRUE)
overall_average_expected <- rowMeans(average_expected, na.rm = TRUE)

# Plot the overall averages
plot(overall_average_true, type = "l", pch = 16, col = "blue", main = "Overall Average of True vs Expected Values", xlab = "Position in List", ylab = "Value", ylim = c(min(c(overall_average_true, overall_average_expected)), max(c(overall_average_true, overall_average_expected))))
lines(overall_average_expected, type = "l", pch = 16, col = "red")
legend("topright", legend = c("True Values", "Expected Values"), col = c("blue", "red"), lty = 1, cex = 0.8)

# Initialize matrices to store averages for each position
average_bid <- matrix(NA, nrow = 100, ncol = 10)
average_ask <- matrix(NA, nrow = 100, ncol = 10)

# Loop through each simulation (n)
for (n in 1:10) {
  # Extract True values from the aggregated_results_4 dataframe
  Bids_set7 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_7[n, 4])), ", ")
  
  # Extract Expected values from the aggregated_results_4 dataframe
  Asks_set7 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_7[n, 5])), ", ")
  
  # Loop through each position (i)
  for (i in 1:100) {
    # Extract True and Expected values for the i-th position
    Bids <- sapply(Bids_set7, function(x) as.numeric(x[i]))
    Asks <- sapply(Asks_set7, function(x) as.numeric(x[i]))
    
    # Calculate the average of True and Expected values for the i-th position
    average_bid[i, n] <- mean(Bids, na.rm = TRUE)
    average_ask[i, n] <- mean(Asks, na.rm = TRUE)
  }
}

# Calculate the overall average for each position across all simulations
overall_average_bid <- rowMeans(average_bid, na.rm = TRUE)
overall_average_ask <- rowMeans(average_ask, na.rm = TRUE)

# Plot the overall averages
plot(overall_average_bid, type = "l", pch = 16, col = "blue", main = "Overall Average of Bids vs Asks", xlab = "Position in List", ylab = "Value", ylim = c(min(c(overall_average_bid, overall_average_ask)), max(c(overall_average_bid, overall_average_ask))))
lines(overall_average_ask, type = "l", pch = 16, col = "red")
legend("topright", legend = c("Bids", "Asks"), col = c("blue", "red"), lty = 1, cex = 0.8)

# Initialize matrices to store averages for each position
average_MM_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_Informed_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_NoisyInformed1_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_NoisyInformed2_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_NoisyInformed3_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_NoisyInformed4_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_NoisyInformed5_pnl <- matrix(NA, nrow = 100, ncol = 10)

# Loop through each simulation (n)
for (n in 1:10) {

  MM_pnl_set7 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_7[n, 6])), ", ")

  Informed_pnl_set7 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_7[n, 8])), ", ")
  
  NoisyInformed1_pnl_set7 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_7[n, 10])), ", ")
  
  NoisyInformed2_pnl_set7 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_7[n, 12])), ", ")
  
  NoisyInformed3_pnl_set7 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_7[n, 14])), ", ")
  
  NoisyInformed4_pnl_set7 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_7[n, 16])), ", ")
  
  NoisyInformed5_pnl_set7 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_7[n, 18])), ", ")
  
  # Loop through each position (i)
  for (i in 1:100) {
    # Extract True and Expected values for the i-th position
    MM_pnl <- sapply(MM_pnl_set7, function(x) as.numeric(x[i]))
    Informed_pnl <- sapply(Informed_pnl_set7, function(x) as.numeric(x[i]))
    NoisyInformed1_pnl <- sapply(NoisyInformed1_pnl_set7, function(x) as.numeric(x[i]))
    NoisyInformed2_pnl <- sapply(NoisyInformed2_pnl_set7, function(x) as.numeric(x[i]))
    NoisyInformed3_pnl <- sapply(NoisyInformed3_pnl_set7, function(x) as.numeric(x[i]))
    NoisyInformed4_pnl <- sapply(NoisyInformed4_pnl_set7, function(x) as.numeric(x[i]))
    NoisyInformed5_pnl <- sapply(NoisyInformed5_pnl_set7, function(x) as.numeric(x[i]))
    
    # Calculate the average of True and Expected values for the i-th position
    average_MM_pnl[i, n] <- mean(MM_pnl, na.rm = TRUE)
    average_Informed_pnl[i, n] <- mean(Informed_pnl, na.rm = TRUE)
    average_NoisyInformed1_pnl[i, n] <- mean(NoisyInformed1_pnl, na.rm = TRUE)
    average_NoisyInformed2_pnl[i, n] <- mean(NoisyInformed2_pnl, na.rm = TRUE)
    average_NoisyInformed3_pnl[i, n] <- mean(NoisyInformed3_pnl, na.rm = TRUE)
    average_NoisyInformed4_pnl[i, n] <- mean(NoisyInformed4_pnl, na.rm = TRUE)
    average_NoisyInformed5_pnl[i, n] <- mean(NoisyInformed5_pnl, na.rm = TRUE)
  }
}

# Calculate the overall average for each position across all simulations
overall_average_MM_pnl <- rowMeans(average_MM_pnl, na.rm = TRUE)
overall_average_Informed_pnl <- rowMeans(average_Informed_pnl, na.rm = TRUE)
overall_average_NoisyInformed1_pnl <- rowMeans(average_NoisyInformed1_pnl, na.rm = TRUE)
overall_average_NoisyInformed2_pnl <- rowMeans(average_NoisyInformed2_pnl, na.rm = TRUE)
overall_average_NoisyInformed3_pnl <- rowMeans(average_NoisyInformed3_pnl, na.rm = TRUE)
overall_average_NoisyInformed4_pnl <- rowMeans(average_NoisyInformed4_pnl, na.rm = TRUE)
overall_average_NoisyInformed5_pnl <- rowMeans(average_NoisyInformed5_pnl, na.rm = TRUE)

# Plot the overall averages
plot(overall_average_MM_pnl, type = "l", pch = 16, col = "black", main = "Overall Average PNL", xlab = "Position in List", ylab = "Value", ylim = c(min(c(overall_average_MM_pnl, overall_average_Informed_pnl, overall_average_NoisyInformed1_pnl, overall_average_NoisyInformed2_pnl, overall_average_NoisyInformed3_pnl, overall_average_NoisyInformed4_pnl, overall_average_NoisyInformed5_pnl)), max(c(overall_average_MM_pnl, overall_average_Informed_pnl, overall_average_NoisyInformed1_pnl, overall_average_NoisyInformed2_pnl, overall_average_NoisyInformed3_pnl, overall_average_NoisyInformed4_pnl, overall_average_NoisyInformed5_pnl))))
lines(overall_average_Informed_pnl, type = "l", pch = 16, col = "red")
lines(overall_average_NoisyInformed1_pnl, type = "l", pch = 16, col = "green")
lines(overall_average_NoisyInformed2_pnl, type = "l", pch = 16, col = "yellow")
lines(overall_average_NoisyInformed3_pnl, type = "l", pch = 16, col = "blue")
lines(overall_average_NoisyInformed4_pnl, type = "l", pch = 16, col = "purple")
lines(overall_average_NoisyInformed5_pnl, type = "l", pch = 16, col = "orange")

# Add legend
legend("bottomleft", legend = c("Market Maker", "Informed", "Noisy Informed 1", "Noisy Informed 2", "Noisy Informed 3", "Noisy Informed 4", "Noisy Informed 5"), col = c("black", "red", "green", "yellow", "blue", "purple", "orange"), lty = 1, cex = 0.8)

# Initialize matrices to store averages for each position
average_MM_pos <- matrix(NA, nrow = 100, ncol = 10)
average_Informed_pos <- matrix(NA, nrow = 100, ncol = 10)
average_NoisyInformed1_pos <- matrix(NA, nrow = 100, ncol = 10)
average_NoisyInformed2_pos <- matrix(NA, nrow = 100, ncol = 10)
average_NoisyInformed3_pos <- matrix(NA, nrow = 100, ncol = 10)
average_NoisyInformed4_pos <- matrix(NA, nrow = 100, ncol = 10)
average_NoisyInformed5_pos <- matrix(NA, nrow = 100, ncol = 10)

# Loop through each simulation (n)
for (n in 1:10) {

  MM_pos_set7 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_7[n, 7])), ", ")

  Informed_pos_set7 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_7[n, 9])), ", ")
  
  NoisyInformed1_pos_set7 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_7[n, 11])), ", ")
  
  NoisyInformed2_pos_set7 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_7[n, 13])), ", ")
  
  NoisyInformed3_pos_set7 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_7[n, 15])), ", ")
  
  NoisyInformed4_pos_set7 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_7[n, 17])), ", ")
  
  NoisyInformed5_pos_set7 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_7[n, 19])), ", ")
  
  # Loop through each position (i)
  for (i in 1:100) {
    # Extract True and Expected values for the i-th position
    MM_pos <- sapply(MM_pos_set7, function(x) as.numeric(x[i]))
    Informed_pos <- sapply(Informed_pos_set7, function(x) as.numeric(x[i]))
    NoisyInformed1_pos <- sapply(NoisyInformed1_pos_set7, function(x) as.numeric(x[i]))
    NoisyInformed2_pos <- sapply(NoisyInformed2_pos_set7, function(x) as.numeric(x[i]))
    NoisyInformed3_pos <- sapply(NoisyInformed3_pos_set7, function(x) as.numeric(x[i]))
    NoisyInformed4_pos <- sapply(NoisyInformed4_pos_set7, function(x) as.numeric(x[i]))
    NoisyInformed5_pos <- sapply(NoisyInformed5_pos_set7, function(x) as.numeric(x[i]))
    
    # Calculate the average of True and Expected values for the i-th position
    average_MM_pos[i, n] <- mean(MM_pos, na.rm = TRUE)
    average_Informed_pos[i, n] <- mean(Informed_pos, na.rm = TRUE)
    average_NoisyInformed1_pos[i, n] <- mean(NoisyInformed1_pos, na.rm = TRUE)
    average_NoisyInformed2_pos[i, n] <- mean(NoisyInformed2_pos, na.rm = TRUE)
    average_NoisyInformed3_pos[i, n] <- mean(NoisyInformed3_pos, na.rm = TRUE)
    average_NoisyInformed4_pos[i, n] <- mean(NoisyInformed4_pos, na.rm = TRUE)
    average_NoisyInformed5_pos[i, n] <- mean(NoisyInformed5_pos, na.rm = TRUE)
  }
}

# Calculate the overall average for each position across all simulations
overall_average_MM_pos <- rowMeans(average_MM_pos, na.rm = TRUE)
overall_average_Informed_pos <- rowMeans(average_Informed_pos, na.rm = TRUE)
overall_average_NoisyInformed1_pos <- rowMeans(average_NoisyInformed1_pos, na.rm = TRUE)
overall_average_NoisyInformed2_pos <- rowMeans(average_NoisyInformed2_pos, na.rm = TRUE)
overall_average_NoisyInformed3_pos <- rowMeans(average_NoisyInformed3_pos, na.rm = TRUE)
overall_average_NoisyInformed4_pos <- rowMeans(average_NoisyInformed4_pos, na.rm = TRUE)
overall_average_NoisyInformed5_pos <- rowMeans(average_NoisyInformed5_pos, na.rm = TRUE)

# Plot the overall averages
plot(overall_average_MM_pos, type = "l", pch = 16, col = "black", main = "Overall Average Position", xlab = "Position in List", ylab = "Value", ylim = c(min(c(overall_average_MM_pos, overall_average_Informed_pos, overall_average_NoisyInformed1_pos, overall_average_NoisyInformed2_pos, overall_average_NoisyInformed3_pos, overall_average_NoisyInformed4_pos, overall_average_NoisyInformed5_pos)), max(c(overall_average_MM_pos, overall_average_Informed_pos, overall_average_NoisyInformed1_pos, overall_average_NoisyInformed2_pos, overall_average_NoisyInformed3_pos, overall_average_NoisyInformed4_pos, overall_average_NoisyInformed5_pos))))
lines(overall_average_Informed_pos, type = "l", pch = 16, col = "red")
lines(overall_average_NoisyInformed1_pos, type = "l", pch = 16, col = "green")
lines(overall_average_NoisyInformed2_pos, type = "l", pch = 16, col = "yellow")
lines(overall_average_NoisyInformed3_pos, type = "l", pch = 16, col = "blue")
lines(overall_average_NoisyInformed4_pos, type = "l", pch = 16, col = "purple")
lines(overall_average_NoisyInformed5_pos, type = "l", pch = 16, col = "orange")

# Add legend
legend("bottomleft", legend = c("Market Maker", "Informed", "Noisy Informed 1", "Noisy Informed 2", "Noisy Informed 3", "Noisy Informed 4", "Noisy Informed 5"), col = c("black", "red", "green", "yellow", "blue", "purple", "orange"), lty = 1, cex = 0.8)

set8 (1 informed + 2 noisy informed + 3 noisy)

# Initialize matrices to store averages for each position
average_true <- matrix(NA, nrow = 100, ncol = 10)
average_expected <- matrix(NA, nrow = 100, ncol = 10)

# Loop through each simulation (n)
for (n in 1:10) {
  # Extract True values from the aggregated_results_4 dataframe
  TrueValues_set8 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_8[n, 2])), ", ")
  
  # Extract Expected values from the aggregated_results_4 dataframe
  ExpectedValues_set8 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_8[n, 3])), ", ")
  
  # Loop through each position (i)
  for (i in 1:100) {
    # Extract True and Expected values for the i-th position
    True_values <- sapply(TrueValues_set7, function(x) as.numeric(x[i]))
    Expected_values <- sapply(ExpectedValues_set6, function(x) as.numeric(x[i]))
    
    # Calculate the average of True and Expected values for the i-th position
    average_true[i, n] <- mean(True_values, na.rm = TRUE)
    average_expected[i, n] <- mean(Expected_values, na.rm = TRUE)
  }
}

# Calculate the overall average for each position across all simulations
overall_average_true <- rowMeans(average_true, na.rm = TRUE)
overall_average_expected <- rowMeans(average_expected, na.rm = TRUE)

# Plot the overall averages
plot(overall_average_true, type = "l", pch = 16, col = "blue", main = "Overall Average of True vs Expected Values", xlab = "Position in List", ylab = "Value", ylim = c(min(c(overall_average_true, overall_average_expected)), max(c(overall_average_true, overall_average_expected))))
lines(overall_average_expected, type = "l", pch = 16, col = "red")
legend("topright", legend = c("True Values", "Expected Values"), col = c("blue", "red"), lty = 1, cex = 0.8)

# Initialize matrices to store averages for each position
average_bid <- matrix(NA, nrow = 100, ncol = 10)
average_ask <- matrix(NA, nrow = 100, ncol = 10)

# Loop through each simulation (n)
for (n in 1:10) {
  # Extract True values from the aggregated_results_4 dataframe
  Bids_set8 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_8[n, 4])), ", ")
  
  # Extract Expected values from the aggregated_results_4 dataframe
  Asks_set8 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_8[n, 5])), ", ")
  
  # Loop through each position (i)
  for (i in 1:100) {
    # Extract True and Expected values for the i-th position
    Bids <- sapply(Bids_set8, function(x) as.numeric(x[i]))
    Asks <- sapply(Asks_set8, function(x) as.numeric(x[i]))
    
    # Calculate the average of True and Expected values for the i-th position
    average_bid[i, n] <- mean(Bids, na.rm = TRUE)
    average_ask[i, n] <- mean(Asks, na.rm = TRUE)
  }
}

# Calculate the overall average for each position across all simulations
overall_average_bid <- rowMeans(average_bid, na.rm = TRUE)
overall_average_ask <- rowMeans(average_ask, na.rm = TRUE)

# Plot the overall averages
plot(overall_average_bid, type = "l", pch = 16, col = "blue", main = "Overall Average of Bids vs Asks", xlab = "Position in List", ylab = "Value", ylim = c(min(c(overall_average_bid, overall_average_ask)), max(c(overall_average_bid, overall_average_ask))))
lines(overall_average_ask, type = "l", pch = 16, col = "red")
legend("topright", legend = c("Bids", "Asks"), col = c("blue", "red"), lty = 1, cex = 0.8)

# Initialize matrices to store averages for each position
average_MM_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_Informed_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_NoisyInformed1_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_NoisyInformed2_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_Noisy1_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_Noisy2_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_Noisy3_pnl <- matrix(NA, nrow = 100, ncol = 10)

# Loop through each simulation (n)
for (n in 1:10) {

  MM_pnl_set8 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_8[n, 6])), ", ")

  Informed_pnl_set8 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_8[n, 8])), ", ")
  
  NoisyInformed1_pnl_set8 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_8[n, 10])), ", ")
  
  NoisyInformed2_pnl_set8 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_8[n, 12])), ", ")
  
  Noisy1_pnl_set8 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_8[n, 14])), ", ")
  
  Noisy2_pnl_set8 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_8[n, 16])), ", ")
  
  Noisy3_pnl_set8 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_8[n, 18])), ", ")
  
  # Loop through each position (i)
  for (i in 1:100) {
    # Extract True and Expected values for the i-th position
    MM_pnl <- sapply(MM_pnl_set8, function(x) as.numeric(x[i]))
    Informed_pnl <- sapply(Informed_pnl_set8, function(x) as.numeric(x[i]))
    NoisyInformed1_pnl <- sapply(NoisyInformed1_pnl_set8, function(x) as.numeric(x[i]))
    NoisyInformed2_pnl <- sapply(NoisyInformed2_pnl_set8, function(x) as.numeric(x[i]))
    Noisy1_pnl <- sapply(Noisy1_pnl_set8, function(x) as.numeric(x[i]))
    Noisy2_pnl <- sapply(Noisy2_pnl_set8, function(x) as.numeric(x[i]))
    Noisy3_pnl <- sapply(Noisy3_pnl_set8, function(x) as.numeric(x[i]))
    
    # Calculate the average of True and Expected values for the i-th position
    average_MM_pnl[i, n] <- mean(MM_pnl, na.rm = TRUE)
    average_Informed_pnl[i, n] <- mean(Informed_pnl, na.rm = TRUE)
    average_NoisyInformed1_pnl[i, n] <- mean(NoisyInformed1_pnl, na.rm = TRUE)
    average_NoisyInformed2_pnl[i, n] <- mean(NoisyInformed2_pnl, na.rm = TRUE)
    average_Noisy1_pnl[i, n] <- mean(Noisy1_pnl, na.rm = TRUE)
    average_Noisy2_pnl[i, n] <- mean(Noisy2_pnl, na.rm = TRUE)
    average_Noisy3_pnl[i, n] <- mean(Noisy3_pnl, na.rm = TRUE)
  }
}

# Calculate the overall average for each position across all simulations
overall_average_MM_pnl <- rowMeans(average_MM_pnl, na.rm = TRUE)
overall_average_Informed_pnl <- rowMeans(average_Informed_pnl, na.rm = TRUE)
overall_average_NoisyInformed1_pnl <- rowMeans(average_NoisyInformed1_pnl, na.rm = TRUE)
overall_average_NoisyInformed2_pnl <- rowMeans(average_NoisyInformed2_pnl, na.rm = TRUE)
overall_average_Noisy1_pnl <- rowMeans(average_Noisy1_pnl, na.rm = TRUE)
overall_average_Noisy2_pnl <- rowMeans(average_Noisy2_pnl, na.rm = TRUE)
overall_average_Noisy3_pnl <- rowMeans(average_Noisy3_pnl, na.rm = TRUE)

# Plot the overall averages
plot(overall_average_MM_pnl, type = "l", pch = 16, col = "black", main = "Overall Average PNL", xlab = "Position in List", ylab = "Value", ylim = c(min(c(overall_average_MM_pnl, overall_average_Informed_pnl, overall_average_NoisyInformed1_pnl, overall_average_NoisyInformed2_pnl, overall_average_Noisy1_pnl, overall_average_Noisy2_pnl, overall_average_Noisy3_pnl)), max(c(overall_average_MM_pnl, overall_average_Informed_pnl, overall_average_NoisyInformed1_pnl, overall_average_NoisyInformed2_pnl, overall_average_Noisy1_pnl, overall_average_Noisy2_pnl, overall_average_Noisy3_pnl))))
lines(overall_average_Informed_pnl, type = "l", pch = 16, col = "red")
lines(overall_average_NoisyInformed1_pnl, type = "l", pch = 16, col = "green")
lines(overall_average_NoisyInformed2_pnl, type = "l", pch = 16, col = "yellow")
lines(overall_average_Noisy1_pnl, type = "l", pch = 16, col = "blue")
lines(overall_average_Noisy2_pnl, type = "l", pch = 16, col = "purple")
lines(overall_average_Noisy3_pnl, type = "l", pch = 16, col = "orange")

# Add legend
legend("bottomleft", legend = c("Market Maker", "Informed", "Noisy Informed 1", "Noisy Informed 2", "Noisy 3", "Noisy 4", "Noisy 5"), col = c("black", "red", "green", "yellow", "blue", "purple", "orange"), lty = 1, cex = 0.8)

# Initialize matrices to store averages for each position
average_MM_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_Informed_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_NoisyInformed1_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_NoisyInformed2_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_Noisy1_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_Noisy2_pnl <- matrix(NA, nrow = 100, ncol = 10)
average_Noisy3_pnl <- matrix(NA, nrow = 100, ncol = 10)

# Loop through each simulation (n)
for (n in 1:10) {

  MM_pos_set8 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_8[n, 7])), ", ")

  Informed_pos_set8 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_8[n, 9])), ", ")
  
  NoisyInformed1_pos_set8 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_8[n, 11])), ", ")
  
  NoisyInformed2_pos_set8 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_8[n, 13])), ", ")
  
  Noisy1_pos_set8 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_8[n, 15])), ", ")
  
  Noisy2_pos_set8 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_8[n, 17])), ", ")
  
  Noisy3_pos_set8 <- strsplit(gsub("\\[|\\]", "", unlist(aggregated_results_8[n, 19])), ", ")
  
  # Loop through each position (i)
  for (i in 1:100) {
    # Extract True and Expected values for the i-th position
    MM_pos <- sapply(MM_pos_set8, function(x) as.numeric(x[i]))
    Informed_pos <- sapply(Informed_pos_set8, function(x) as.numeric(x[i]))
    NoisyInformed1_pos <- sapply(NoisyInformed1_pos_set8, function(x) as.numeric(x[i]))
    NoisyInformed2_pos <- sapply(NoisyInformed2_pos_set8, function(x) as.numeric(x[i]))
    Noisy1_pos <- sapply(Noisy1_pos_set8, function(x) as.numeric(x[i]))
    Noisy2_pos <- sapply(Noisy2_pos_set8, function(x) as.numeric(x[i]))
    Noisy3_pos <- sapply(Noisy3_pos_set8, function(x) as.numeric(x[i]))
    
    # Calculate the average of True and Expected values for the i-th position
    average_MM_pos[i, n] <- mean(MM_pos, na.rm = TRUE)
    average_Informed_pos[i, n] <- mean(Informed_pos, na.rm = TRUE)
    average_NoisyInformed1_pos[i, n] <- mean(NoisyInformed1_pos, na.rm = TRUE)
    average_NoisyInformed2_pos[i, n] <- mean(NoisyInformed2_pos, na.rm = TRUE)
    average_Noisy1_pos[i, n] <- mean(Noisy1_pos, na.rm = TRUE)
    average_Noisy2_pos[i, n] <- mean(Noisy2_pos, na.rm = TRUE)
    average_Noisy3_pos[i, n] <- mean(Noisy3_pos, na.rm = TRUE)
  }
}

# Calculate the overall average for each position across all simulations
overall_average_MM_pos <- rowMeans(average_MM_pos, na.rm = TRUE)
overall_average_Informed_pos <- rowMeans(average_Informed_pos, na.rm = TRUE)
overall_average_NoisyInformed1_pos <- rowMeans(average_NoisyInformed1_pos, na.rm = TRUE)
overall_average_NoisyInformed2_pos <- rowMeans(average_NoisyInformed2_pos, na.rm = TRUE)
overall_average_Noisy1_pos <- rowMeans(average_Noisy1_pos, na.rm = TRUE)
overall_average_Noisy2_pos <- rowMeans(average_Noisy2_pos, na.rm = TRUE)
overall_average_Noisy3_pos <- rowMeans(average_Noisy3_pos, na.rm = TRUE)

# Plot the overall averages
plot(overall_average_MM_pos, type = "l", pch = 16, col = "black", main = "Overall Average Position", xlab = "Position in List", ylab = "Value", ylim = c(min(c(overall_average_MM_pos, overall_average_Informed_pos, overall_average_NoisyInformed1_pos, overall_average_NoisyInformed2_pos, overall_average_Noisy1_pos, overall_average_Noisy2_pos, overall_average_Noisy3_pos)), max(c(overall_average_MM_pos, overall_average_Informed_pos, overall_average_NoisyInformed1_pos, overall_average_NoisyInformed2_pos, overall_average_Noisy1_pos, overall_average_Noisy2_pos, overall_average_Noisy3_pos))))
lines(overall_average_Informed_pos, type = "l", pch = 16, col = "red")
lines(overall_average_NoisyInformed1_pos, type = "l", pch = 16, col = "green")
lines(overall_average_NoisyInformed2_pos, type = "l", pch = 16, col = "yellow")
lines(overall_average_Noisy1_pos, type = "l", pch = 16, col = "blue")
lines(overall_average_Noisy2_pos, type = "l", pch = 16, col = "purple")
lines(overall_average_Noisy3_pos, type = "l", pch = 16, col = "orange")

# Add legend
legend("bottomleft", legend = c("Market Maker", "Informed", "Noisy Informed 1", "Noisy Informed 2", "Noisy 3", "Noisy 4", "Noisy 5"), col = c("black", "red", "green", "yellow", "blue", "purple", "orange"), lty = 1, cex = 0.8)

set9

set10

set11

set12

set13

set14

set15

LS0tCnRpdGxlOiAiRGF0YSBBbmFseXNpcyBhbmQgR2FtZSBUaGVvcnkiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCmBgYHtyfQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkoc3RhdHMpCmBgYAoKIyMjIFRydWUgdmFsdWUgaW4gc2V0MSwgc2ltMQoKYGBge3J9ClRydWVWYWx1ZV9zZXQxIDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c18xWzEsIDJdKSksICIsICIpW1sxXV0KI2F2ZXJhZ2UgPC0gbWVhbihUcnVlVmFsdWVzX3NldDEpCnBsb3QoVHJ1ZVZhbHVlX3NldDEsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAiYmx1ZSIsIG1haW4gPSAiVHJ1ZSBWYWx1ZXMgaW4gc2ltMCIsIHhsYWIgPSAiSXRlcmF0aW9uIiwgeWxhYiA9ICJWYWx1ZSIpCgojVHJ1ZVZhbHVlX3NldDFfc2ltMCA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfMVsxLCAyXSkpLCAiLCAiKVtbMV1dCiN1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzFbMSwgMl0pCiNjbGVhbl9zdHIgPSBnc3ViKCJcXFt8XFxdIiwgIiIsIFRydWVWYWx1ZV9zaW0wKQojVHJ1ZVZhbHVlX3NldDFfc2ltMSA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfMVsyLCAyXSkpLCAiLCAiKVtbMV1dCgojcHJpbnQoVmFsdWVzKQojWCA8LSAxOjEwMAojcGxvdChUcnVlVmFsdWVfc2V0MV9zaW0wLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gImJsdWUiLCBtYWluID0gIlRydWUgVmFsdWVzIGluIHNpbTAiLCB4bGFiID0gIkl0ZXJhdGlvbiIsIHlsYWIgPSAiVmFsdWUiKQojcGxvdChUcnVlVmFsdWVfc2V0MV9zaW0xLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gImJsdWUiLCBtYWluID0gIlRydWUgVmFsdWVzIGluIHNpbTEiLCB4bGFiID0gIkl0ZXJhdGlvbiIsIHlsYWIgPSAiVmFsdWUiKQoKI2ZpdCA8LSBsbShWYWx1ZXMgfiBYKQojYWJsaW5lKGZpdCwgY29sID0gInJlZCIpCmBgYAojIyMgVHJ1ZSB2YWx1ZXMgaW4gc2V0IDEsIGFsbCBzaW0KCmBgYHtyfQojIEluaXRpYWxpemUgYW4gZW1wdHkgdmVjdG9yIHRvIHN0b3JlIHRoZSBUcnVlIHZhbHVlcwpUcnVlVmFsdWVzX3NldDEgPC0gbnVtZXJpYygpCgojIExvb3AgdGhyb3VnaCBlYWNoIGl0ZXJhdGlvbiAobikKZm9yIChuIGluIDE6MTApIHsKICAjIEV4dHJhY3QgVHJ1ZSB2YWx1ZXMgZnJvbSB0aGUgYWdncmVnYXRlZF9yZXN1bHRzXzEgZGF0YWZyYW1lCiAgVHJ1ZVZhbHVlX3NldDEgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzFbbiwgMl0pKSwgIiwgIilbWzFdXQogIAogICMgQXBwZW5kIHRoZSBUcnVlIHZhbHVlcyB0byB0aGUgdmVjdG9yCiAgVHJ1ZVZhbHVlc19zZXQxIDwtIGMoVHJ1ZVZhbHVlc19zZXQxLCBhcy5udW1lcmljKFRydWVWYWx1ZV9zZXQxKSkKfQoKIyBDYWxjdWxhdGUgdGhlIGF2ZXJhZ2Ugb2YgVHJ1ZSB2YWx1ZXMKYXZlcmFnZSA8LSBtZWFuKFRydWVWYWx1ZXNfc2V0MSkKCiMgUGxvdCB0aGUgYXZlcmFnZQpwbG90KFRydWVWYWx1ZXNfc2V0MSwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJibHVlIiwgbWFpbiA9ICJUcnVlIFZhbHVlcyBpbiBzZXQgMSIsIHhsYWIgPSAiSXRlcmF0aW9uIiwgeWxhYiA9ICJWYWx1ZSIpCgojIEFkZCBhIGhvcml6b250YWwgbGluZSBmb3IgdGhlIGF2ZXJhZ2UKYWJsaW5lKGggPSBhdmVyYWdlLCBjb2wgPSAicmVkIiwgbHdkID0gMikKCmBgYAoKIyMjIEV4cGVjdGVkIHZhbHVlIGluIHNldDEsIGFsbCBzaW0KCmBgYHtyfQojIEluaXRpYWxpemUgYW4gZW1wdHkgdmVjdG9yIHRvIHN0b3JlIHRoZSBUcnVlIHZhbHVlcwpFeHBlY3RlZFZhbHVlc19zZXQxIDwtIG51bWVyaWMoKQoKIyBMb29wIHRocm91Z2ggZWFjaCBpdGVyYXRpb24gKG4pCmZvciAobiBpbiAxOjEwKSB7CiAgIyBFeHRyYWN0IFRydWUgdmFsdWVzIGZyb20gdGhlIGFnZ3JlZ2F0ZWRfcmVzdWx0c18xIGRhdGFmcmFtZQogIEV4cGVjdGVkVmFsdWVfc2V0MSA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfMVtuLCAzXSkpLCAiLCAiKVtbMV1dCiAgCiAgIyBBcHBlbmQgdGhlIFRydWUgdmFsdWVzIHRvIHRoZSB2ZWN0b3IKICBFeHBlY3RlZFZhbHVlc19zZXQxIDwtIGMoRXhwZWN0ZWRWYWx1ZXNfc2V0MSwgYXMubnVtZXJpYyhFeHBlY3RlZFZhbHVlX3NldDEpKQp9CgojIENhbGN1bGF0ZSB0aGUgYXZlcmFnZSBvZiBUcnVlIHZhbHVlcwphdmVyYWdlIDwtIG1lYW4oRXhwZWN0ZWRWYWx1ZXNfc2V0MSkKCiMgUGxvdCB0aGUgYXZlcmFnZQpwbG90KEV4cGVjdGVkVmFsdWVzX3NldDEsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAiYmx1ZSIsIG1haW4gPSAiRXhwZWN0ZWQgVmFsdWVzIGluIHNldCAxIiwgeGxhYiA9ICJJdGVyYXRpb24iLCB5bGFiID0gIlZhbHVlIikKCiMgQWRkIGEgaG9yaXpvbnRhbCBsaW5lIGZvciB0aGUgYXZlcmFnZQphYmxpbmUoaCA9IGF2ZXJhZ2UsIGNvbCA9ICJyZWQiLCBsd2QgPSAyKQoKYGBgCgojIyMgVHJ1ZSBhbmQgRXhwZWN0ZWQgVmFsdWVzIGluIHNldCAxCgpgYGB7cn0KIyBJbml0aWFsaXplIGVtcHR5IHZlY3RvcnMgdG8gc3RvcmUgdHJ1ZSBhbmQgZXhwZWN0ZWQgdmFsdWVzClRydWVWYWx1ZXNfc2V0MSA8LSBudW1lcmljKCkKRXhwZWN0ZWRWYWx1ZXNfc2V0MSA8LSBudW1lcmljKCkKCiMgTG9vcCB0aHJvdWdoIGVhY2ggaXRlcmF0aW9uIChuKQpmb3IgKG4gaW4gMToxMCkgewogICMgRXh0cmFjdCBUcnVlIHZhbHVlcyBmcm9tIHRoZSBhZ2dyZWdhdGVkX3Jlc3VsdHNfMSBkYXRhZnJhbWUKICBUcnVlVmFsdWVfc2V0MSA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfMVtuLCAyXSkpLCAiLCAiKVtbMV1dCiAgCiAgIyBFeHRyYWN0IEV4cGVjdGVkIHZhbHVlcyBmcm9tIHRoZSBhZ2dyZWdhdGVkX3Jlc3VsdHNfMSBkYXRhZnJhbWUKICBFeHBlY3RlZFZhbHVlX3NldDEgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzFbbiwgM10pKSwgIiwgIilbWzFdXQogIAogICMgQXBwZW5kIHRoZSBUcnVlIGFuZCBFeHBlY3RlZCB2YWx1ZXMgdG8gdGhlaXIgcmVzcGVjdGl2ZSB2ZWN0b3JzCiAgVHJ1ZVZhbHVlc19zZXQxIDwtIGMoVHJ1ZVZhbHVlc19zZXQxLCBhcy5udW1lcmljKFRydWVWYWx1ZV9zZXQxKSkKICBFeHBlY3RlZFZhbHVlc19zZXQxIDwtIGMoRXhwZWN0ZWRWYWx1ZXNfc2V0MSwgYXMubnVtZXJpYyhFeHBlY3RlZFZhbHVlX3NldDEpKQp9CgojIENhbGN1bGF0ZSB0aGUgYXZlcmFnZSBvZiBUcnVlIHZhbHVlcwphdmVyYWdlX3RydWUgPC0gbWVhbihUcnVlVmFsdWVzX3NldDEpCgojIENhbGN1bGF0ZSB0aGUgYXZlcmFnZSBvZiBFeHBlY3RlZCB2YWx1ZXMKYXZlcmFnZV9leHBlY3RlZCA8LSBtZWFuKEV4cGVjdGVkVmFsdWVzX3NldDEpCgojIFBsb3QgVHJ1ZSBhbmQgRXhwZWN0ZWQgdmFsdWVzIG9uIHRoZSBzYW1lIHBsb3QKcGxvdChUcnVlVmFsdWVzX3NldDEsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAiYmx1ZSIsIG1haW4gPSAiVHJ1ZSB2cyBFeHBlY3RlZCBWYWx1ZXMgaW4gc2V0IDEiLCB4bGFiID0gIkl0ZXJhdGlvbiIsIHlsYWIgPSAiVmFsdWUiKQpsaW5lcyhFeHBlY3RlZFZhbHVlc19zZXQxLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gInJlZCIpCgojIEFkZCBsZWdlbmQKbGVnZW5kKCJ0b3ByaWdodCIsIGxlZ2VuZCA9IGMoIlRydWUgVmFsdWVzIiwgIkV4cGVjdGVkIFZhbHVlcyIpLCBjb2wgPSBjKCJibHVlIiwgInJlZCIpLCBsdHkgPSAxLCBjZXggPSAwLjgpCgojIEFkZCBob3Jpem9udGFsIGxpbmVzIGZvciB0aGUgYXZlcmFnZXMKYWJsaW5lKGggPSBhdmVyYWdlX3RydWUsIGNvbCA9ICJibHVlIiwgbHdkID0gMSkKYWJsaW5lKGggPSBhdmVyYWdlX2V4cGVjdGVkLCBjb2wgPSAicmVkIiwgbHdkID0gMSkKYGBgCgojIyMgQmlkcyBpbiBzZXQxLCBzaW0xCgoKYGBge3J9CkJpZHNfc2V0MSA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfMVsxLCA0XSkpLCAiLCAiKVtbMV1dCiNhdmVyYWdlIDwtIG1lYW4oVHJ1ZVZhbHVlc19zZXQxKQpwbG90KEJpZHNfc2V0MSwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJibHVlIiwgbWFpbiA9ICJUcnVlIFZhbHVlcyBpbiBzaW0wIiwgeGxhYiA9ICJJdGVyYXRpb24iLCB5bGFiID0gIlZhbHVlIikKYGBgCgojIyMgQmlkcyBpbiBzZXQgMSwgYWxsIHNpbQoKYGBge3J9CiMgSW5pdGlhbGl6ZSBhbiBlbXB0eSB2ZWN0b3IgdG8gc3RvcmUgdGhlIFRydWUgdmFsdWVzCkJpZHNfc2V0MSA8LSBudW1lcmljKCkKCiMgTG9vcCB0aHJvdWdoIGVhY2ggaXRlcmF0aW9uIChuKQpmb3IgKG4gaW4gMToxMCkgewogICMgRXh0cmFjdCBUcnVlIHZhbHVlcyBmcm9tIHRoZSBhZ2dyZWdhdGVkX3Jlc3VsdHNfMSBkYXRhZnJhbWUKICBCaWRfc2V0MSA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfMVtuLCA0XSkpLCAiLCAiKVtbMV1dCiAgCiAgIyBBcHBlbmQgdGhlIFRydWUgdmFsdWVzIHRvIHRoZSB2ZWN0b3IgKGNvcnJlY3RlZCB0eXBvKQogIEJpZHNfc2V0MSA8LSBjKEJpZHNfc2V0MSwgYXMubnVtZXJpYyhCaWRfc2V0MSkpCn0KCiMgQ2hlY2sgaWYgdGhlIHZlY3RvciBpcyBwcm9wZXJseSBwb3B1bGF0ZWQKI3ByaW50KEJpZHNfc2V0MSkKCiMgQ2FsY3VsYXRlIHRoZSBhdmVyYWdlIG9mIFRydWUgdmFsdWVzCmF2ZXJhZ2UgPC0gbWVhbihCaWRzX3NldDEsIG5hLnJtID0gVFJVRSkKCiMgUGxvdCB0aGUgdmFsdWVzCnBsb3QoQmlkc19zZXQxLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gImJsdWUiLCBtYWluID0gIkV4cGVjdGVkIFZhbHVlcyBpbiBzZXQgMSIsIHhsYWIgPSAiSXRlcmF0aW9uIiwgeWxhYiA9ICJWYWx1ZSIpCgojIEFkZCBhIGhvcml6b250YWwgbGluZSBmb3IgdGhlIGF2ZXJhZ2UKYWJsaW5lKGggPSBhdmVyYWdlLCBjb2wgPSAicmVkIiwgbHdkID0gMikKCmBgYAoKIyMjIEJpZHMgYW5kIEFza3MgT3ZlcmFsbAoKYGBge3J9CiMgSW5pdGlhbGl6ZSBlbXB0eSB2ZWN0b3JzIHRvIHN0b3JlIHRoZSBCaWQgYW5kIEFzayB2YWx1ZXMKQmlkc19zZXQxIDwtIG51bWVyaWMoKQpBc2tzX3NldDEgPC0gbnVtZXJpYygpCgojIExvb3AgdGhyb3VnaCBlYWNoIGl0ZXJhdGlvbiAobikKZm9yIChuIGluIDE6MTApIHsKICAjIEV4dHJhY3QgQmlkIHZhbHVlcyBmcm9tIHRoZSBhZ2dyZWdhdGVkX3Jlc3VsdHNfMSBkYXRhZnJhbWUKICBCaWRfc2V0MSA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfMVtuLCA0XSkpLCAiLCAiKVtbMV1dCiAgCiAgIyBFeHRyYWN0IEFzayB2YWx1ZXMgZnJvbSB0aGUgYWdncmVnYXRlZF9yZXN1bHRzXzEgZGF0YWZyYW1lIChuZXh0IGNvbHVtbikKICBBc2tfc2V0MSA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfMVtuLCA1XSkpLCAiLCAiKVtbMV1dCiAgCiAgIyBBcHBlbmQgdGhlIEJpZCBhbmQgQXNrIHZhbHVlcyB0byB0aGVpciByZXNwZWN0aXZlIHZlY3RvcnMKICBCaWRzX3NldDEgPC0gYyhCaWRzX3NldDEsIGFzLm51bWVyaWMoQmlkX3NldDEpKQogIEFza3Nfc2V0MSA8LSBjKEFza3Nfc2V0MSwgYXMubnVtZXJpYyhBc2tfc2V0MSkpCn0KCiMgQ2FsY3VsYXRlIHRoZSBhdmVyYWdlIG9mIEJpZCBhbmQgQXNrIHZhbHVlcwphdmVyYWdlX2JpZHMgPC0gbWVhbihCaWRzX3NldDEsIG5hLnJtID0gVFJVRSkKYXZlcmFnZV9hc2tzIDwtIG1lYW4oQXNrc19zZXQxLCBuYS5ybSA9IFRSVUUpCgojIFBsb3QgdGhlIEJpZCBhbmQgQXNrIHZhbHVlcyBvbiB0aGUgc2FtZSBwbG90CnBsb3QoQmlkc19zZXQxLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gImJsdWUiLCBtYWluID0gIkJpZHMgdnMgQXNrcyBpbiBzZXQgMSIsIHhsYWIgPSAiSXRlcmF0aW9uIiwgeWxhYiA9ICJWYWx1ZSIpCmxpbmVzKEFza3Nfc2V0MSwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJyZWQiKQoKIyBBZGQgbGVnZW5kCmxlZ2VuZCgidG9wcmlnaHQiLCBsZWdlbmQgPSBjKCJCaWRzIiwgIkFza3MiKSwgY29sID0gYygiYmx1ZSIsICJyZWQiKSwgbHR5ID0gMSwgY2V4ID0gMC44KQoKIyBBZGQgaG9yaXpvbnRhbCBsaW5lcyBmb3IgdGhlIGF2ZXJhZ2VzCmFibGluZShoID0gYXZlcmFnZV9iaWRzLCBjb2wgPSAiYmx1ZSIsIGx0eSA9IDEpCmFibGluZShoID0gYXZlcmFnZV9hc2tzLCBjb2wgPSAicmVkIiwgbHR5ID0gMSkKCmBgYAoKIyMjIFN0YXJ0IEZyb20gSGVyZQoKCiMjIHNldCAxICg2IGluZm9ybWVkKQoKYGBge3J9CiMgSW5pdGlhbGl6ZSBtYXRyaWNlcyB0byBzdG9yZSBhdmVyYWdlcyBmb3IgZWFjaCBwb3NpdGlvbgphdmVyYWdlX3RydWUgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCmF2ZXJhZ2VfZXhwZWN0ZWQgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCgojIExvb3AgdGhyb3VnaCBlYWNoIHNpbXVsYXRpb24gKG4pCmZvciAobiBpbiAxOjEwKSB7CiAgIyBFeHRyYWN0IFRydWUgdmFsdWVzIGZyb20gdGhlIGFnZ3JlZ2F0ZWRfcmVzdWx0c180IGRhdGFmcmFtZQogIFRydWVWYWx1ZXNfc2V0MSA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfMVtuLCAyXSkpLCAiLCAiKQogIAogICMgRXh0cmFjdCBFeHBlY3RlZCB2YWx1ZXMgZnJvbSB0aGUgYWdncmVnYXRlZF9yZXN1bHRzXzQgZGF0YWZyYW1lCiAgRXhwZWN0ZWRWYWx1ZXNfc2V0NTEgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzFbbiwgM10pKSwgIiwgIikKICAKICAjIExvb3AgdGhyb3VnaCBlYWNoIHBvc2l0aW9uIChpKQogIGZvciAoaSBpbiAxOjEwMCkgewogICAgIyBFeHRyYWN0IFRydWUgYW5kIEV4cGVjdGVkIHZhbHVlcyBmb3IgdGhlIGktdGggcG9zaXRpb24KICAgIFRydWVfdmFsdWVzIDwtIHNhcHBseShUcnVlVmFsdWVzX3NldDUsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICBFeHBlY3RlZF92YWx1ZXMgPC0gc2FwcGx5KEV4cGVjdGVkVmFsdWVzX3NldDUsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICAKICAgICMgQ2FsY3VsYXRlIHRoZSBhdmVyYWdlIG9mIFRydWUgYW5kIEV4cGVjdGVkIHZhbHVlcyBmb3IgdGhlIGktdGggcG9zaXRpb24KICAgIGF2ZXJhZ2VfdHJ1ZVtpLCBuXSA8LSBtZWFuKFRydWVfdmFsdWVzLCBuYS5ybSA9IFRSVUUpCiAgICBhdmVyYWdlX2V4cGVjdGVkW2ksIG5dIDwtIG1lYW4oRXhwZWN0ZWRfdmFsdWVzLCBuYS5ybSA9IFRSVUUpCiAgfQp9CgojIENhbGN1bGF0ZSB0aGUgb3ZlcmFsbCBhdmVyYWdlIGZvciBlYWNoIHBvc2l0aW9uIGFjcm9zcyBhbGwgc2ltdWxhdGlvbnMKb3ZlcmFsbF9hdmVyYWdlX3RydWUgPC0gcm93TWVhbnMoYXZlcmFnZV90cnVlLCBuYS5ybSA9IFRSVUUpCm92ZXJhbGxfYXZlcmFnZV9leHBlY3RlZCA8LSByb3dNZWFucyhhdmVyYWdlX2V4cGVjdGVkLCBuYS5ybSA9IFRSVUUpCgojIFBsb3QgdGhlIG92ZXJhbGwgYXZlcmFnZXMKcGxvdChvdmVyYWxsX2F2ZXJhZ2VfdHJ1ZSwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJibHVlIiwgbWFpbiA9ICJPdmVyYWxsIEF2ZXJhZ2Ugb2YgVHJ1ZSB2cyBFeHBlY3RlZCBWYWx1ZXMiLCB4bGFiID0gIlBvc2l0aW9uIGluIExpc3QiLCB5bGFiID0gIlZhbHVlIiwgeWxpbSA9IGMobWluKGMob3ZlcmFsbF9hdmVyYWdlX3RydWUsIG92ZXJhbGxfYXZlcmFnZV9leHBlY3RlZCkpLCBtYXgoYyhvdmVyYWxsX2F2ZXJhZ2VfdHJ1ZSwgb3ZlcmFsbF9hdmVyYWdlX2V4cGVjdGVkKSkpKQpsaW5lcyhvdmVyYWxsX2F2ZXJhZ2VfZXhwZWN0ZWQsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAicmVkIikKbGVnZW5kKCJ0b3ByaWdodCIsIGxlZ2VuZCA9IGMoIlRydWUgVmFsdWVzIiwgIkV4cGVjdGVkIFZhbHVlcyIpLCBjb2wgPSBjKCJibHVlIiwgInJlZCIpLCBsdHkgPSAxLCBjZXggPSAwLjgpCmBgYAoKYGBge3J9CiMgSW5pdGlhbGl6ZSBtYXRyaWNlcyB0byBzdG9yZSBhdmVyYWdlcyBmb3IgZWFjaCBwb3NpdGlvbgphdmVyYWdlX2JpZCA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9hc2sgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCgojIExvb3AgdGhyb3VnaCBlYWNoIHNpbXVsYXRpb24gKG4pCmZvciAobiBpbiAxOjEwKSB7CiAgIyBFeHRyYWN0IFRydWUgdmFsdWVzIGZyb20gdGhlIGFnZ3JlZ2F0ZWRfcmVzdWx0c180IGRhdGFmcmFtZQogIEJpZHNfc2V0MSA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfMVtuLCA0XSkpLCAiLCAiKQogIAogICMgRXh0cmFjdCBFeHBlY3RlZCB2YWx1ZXMgZnJvbSB0aGUgYWdncmVnYXRlZF9yZXN1bHRzXzQgZGF0YWZyYW1lCiAgQXNrc19zZXQxIDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c18xW24sIDVdKSksICIsICIpCiAgCiAgIyBMb29wIHRocm91Z2ggZWFjaCBwb3NpdGlvbiAoaSkKICBmb3IgKGkgaW4gMToxMDApIHsKICAgICMgRXh0cmFjdCBUcnVlIGFuZCBFeHBlY3RlZCB2YWx1ZXMgZm9yIHRoZSBpLXRoIHBvc2l0aW9uCiAgICBCaWRzIDwtIHNhcHBseShCaWRzX3NldDEsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICBBc2tzIDwtIHNhcHBseShBc2tzX3NldDEsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICAKICAgICMgQ2FsY3VsYXRlIHRoZSBhdmVyYWdlIG9mIFRydWUgYW5kIEV4cGVjdGVkIHZhbHVlcyBmb3IgdGhlIGktdGggcG9zaXRpb24KICAgIGF2ZXJhZ2VfYmlkW2ksIG5dIDwtIG1lYW4oQmlkcywgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9hc2tbaSwgbl0gPC0gbWVhbihBc2tzLCBuYS5ybSA9IFRSVUUpCiAgfQp9CgojIENhbGN1bGF0ZSB0aGUgb3ZlcmFsbCBhdmVyYWdlIGZvciBlYWNoIHBvc2l0aW9uIGFjcm9zcyBhbGwgc2ltdWxhdGlvbnMKb3ZlcmFsbF9hdmVyYWdlX2JpZCA8LSByb3dNZWFucyhhdmVyYWdlX2JpZCwgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfYXNrIDwtIHJvd01lYW5zKGF2ZXJhZ2VfYXNrLCBuYS5ybSA9IFRSVUUpCgojIFBsb3QgdGhlIG92ZXJhbGwgYXZlcmFnZXMKcGxvdChvdmVyYWxsX2F2ZXJhZ2VfYmlkLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gImJsdWUiLCBtYWluID0gIk92ZXJhbGwgQXZlcmFnZSBvZiBCaWRzIHZzIEFza3MiLCB4bGFiID0gIlBvc2l0aW9uIGluIExpc3QiLCB5bGFiID0gIlZhbHVlIiwgeWxpbSA9IGMobWluKGMob3ZlcmFsbF9hdmVyYWdlX2JpZCwgb3ZlcmFsbF9hdmVyYWdlX2FzaykpLCBtYXgoYyhvdmVyYWxsX2F2ZXJhZ2VfYmlkLCBvdmVyYWxsX2F2ZXJhZ2VfYXNrKSkpKQpsaW5lcyhvdmVyYWxsX2F2ZXJhZ2VfYXNrLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gInJlZCIpCmxlZ2VuZCgidG9wcmlnaHQiLCBsZWdlbmQgPSBjKCJCaWRzIiwgIkFza3MiKSwgY29sID0gYygiYmx1ZSIsICJyZWQiKSwgbHR5ID0gMSwgY2V4ID0gMC44KQpgYGAKCgpgYGB7cn0KIyBJbml0aWFsaXplIG1hdHJpY2VzIHRvIHN0b3JlIGF2ZXJhZ2VzIGZvciBlYWNoIHBvc2l0aW9uCmF2ZXJhZ2VfTU1fcG5sIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQphdmVyYWdlX0luZm9ybWVkMV9wbmwgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCmF2ZXJhZ2VfSW5mb3JtZWQyX3BubCA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9JbmZvcm1lZDNfcG5sIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQphdmVyYWdlX0luZm9ybWVkNF9wbmwgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCmF2ZXJhZ2VfSW5mb3JtZWQ1X3BubCA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9JbmZvcm1lZDZfcG5sIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQoKIyBMb29wIHRocm91Z2ggZWFjaCBzaW11bGF0aW9uIChuKQpmb3IgKG4gaW4gMToxMCkgewoKICBNTV9wbmxfc2V0MSA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfMVtuLCA2XSkpLCAiLCAiKQoKICBJbmZvcm1lZDFfcG5sX3NldDEgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzFbbiwgOF0pKSwgIiwgIikKICAKICBJbmZvcm1lZDJfcG5sX3NldDEgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzFbbiwgMTBdKSksICIsICIpCiAgCiAgSW5mb3JtZWQzX3BubF9zZXQxIDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c18xW24sIDEyXSkpLCAiLCAiKQogIAogIEluZm9ybWVkNF9wbmxfc2V0MSA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfMVtuLCAxNF0pKSwgIiwgIikKICAKICBJbmZvcm1lZDVfcG5sX3NldDEgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzFbbiwgMTZdKSksICIsICIpCiAgCiAgSW5mb3JtZWQ2X3BubF9zZXQxIDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c18xW24sIDE4XSkpLCAiLCAiKQogIAogICMgTG9vcCB0aHJvdWdoIGVhY2ggcG9zaXRpb24gKGkpCiAgZm9yIChpIGluIDE6MTAwKSB7CiAgICAjIEV4dHJhY3QgVHJ1ZSBhbmQgRXhwZWN0ZWQgdmFsdWVzIGZvciB0aGUgaS10aCBwb3NpdGlvbgogICAgTU1fcG5sIDwtIHNhcHBseShNTV9wbmxfc2V0MSwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIEluZm9ybWVkMV9wbmwgPC0gc2FwcGx5KEluZm9ybWVkMV9wbmxfc2V0MSwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIEluZm9ybWVkMl9wbmwgPC0gc2FwcGx5KEluZm9ybWVkMl9wbmxfc2V0MSwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIEluZm9ybWVkM19wbmwgPC0gc2FwcGx5KEluZm9ybWVkM19wbmxfc2V0MSwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIEluZm9ybWVkNF9wbmwgPC0gc2FwcGx5KEluZm9ybWVkNF9wbmxfc2V0MSwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIEluZm9ybWVkNV9wbmwgPC0gc2FwcGx5KEluZm9ybWVkNV9wbmxfc2V0MSwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIEluZm9ybWVkNl9wbmwgPC0gc2FwcGx5KEluZm9ybWVkNl9wbmxfc2V0MSwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIAogICAgIyBDYWxjdWxhdGUgdGhlIGF2ZXJhZ2Ugb2YgVHJ1ZSBhbmQgRXhwZWN0ZWQgdmFsdWVzIGZvciB0aGUgaS10aCBwb3NpdGlvbgogICAgYXZlcmFnZV9NTV9wbmxbaSwgbl0gPC0gbWVhbihNTV9wbmwsIG5hLnJtID0gVFJVRSkKICAgIGF2ZXJhZ2VfSW5mb3JtZWQxX3BubFtpLCBuXSA8LSBtZWFuKEluZm9ybWVkMV9wbmwsIG5hLnJtID0gVFJVRSkKICAgIGF2ZXJhZ2VfSW5mb3JtZWQyX3BubFtpLCBuXSA8LSBtZWFuKEluZm9ybWVkMl9wbmwsIG5hLnJtID0gVFJVRSkKICAgIGF2ZXJhZ2VfSW5mb3JtZWQzX3BubFtpLCBuXSA8LSBtZWFuKEluZm9ybWVkM19wbmwsIG5hLnJtID0gVFJVRSkKICAgIGF2ZXJhZ2VfSW5mb3JtZWQ0X3BubFtpLCBuXSA8LSBtZWFuKEluZm9ybWVkNF9wbmwsIG5hLnJtID0gVFJVRSkKICAgIGF2ZXJhZ2VfSW5mb3JtZWQ1X3BubFtpLCBuXSA8LSBtZWFuKEluZm9ybWVkNV9wbmwsIG5hLnJtID0gVFJVRSkKICAgIGF2ZXJhZ2VfSW5mb3JtZWQ2X3BubFtpLCBuXSA8LSBtZWFuKEluZm9ybWVkNl9wbmwsIG5hLnJtID0gVFJVRSkKICB9Cn0KCiMgQ2FsY3VsYXRlIHRoZSBvdmVyYWxsIGF2ZXJhZ2UgZm9yIGVhY2ggcG9zaXRpb24gYWNyb3NzIGFsbCBzaW11bGF0aW9ucwpvdmVyYWxsX2F2ZXJhZ2VfTU1fcG5sIDwtIHJvd01lYW5zKGF2ZXJhZ2VfTU1fcG5sLCBuYS5ybSA9IFRSVUUpCm92ZXJhbGxfYXZlcmFnZV9JbmZvcm1lZDFfcG5sIDwtIHJvd01lYW5zKGF2ZXJhZ2VfSW5mb3JtZWQxX3BubCwgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfSW5mb3JtZWQyX3BubCA8LSByb3dNZWFucyhhdmVyYWdlX0luZm9ybWVkMl9wbmwsIG5hLnJtID0gVFJVRSkKb3ZlcmFsbF9hdmVyYWdlX0luZm9ybWVkM19wbmwgPC0gcm93TWVhbnMoYXZlcmFnZV9JbmZvcm1lZDNfcG5sLCBuYS5ybSA9IFRSVUUpCm92ZXJhbGxfYXZlcmFnZV9JbmZvcm1lZDRfcG5sIDwtIHJvd01lYW5zKGF2ZXJhZ2VfSW5mb3JtZWQ0X3BubCwgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfSW5mb3JtZWQ1X3BubCA8LSByb3dNZWFucyhhdmVyYWdlX0luZm9ybWVkNV9wbmwsIG5hLnJtID0gVFJVRSkKb3ZlcmFsbF9hdmVyYWdlX0luZm9ybWVkNl9wbmwgPC0gcm93TWVhbnMoYXZlcmFnZV9JbmZvcm1lZDZfcG5sLCBuYS5ybSA9IFRSVUUpCgojIFBsb3QgdGhlIG92ZXJhbGwgYXZlcmFnZXMKcGxvdChvdmVyYWxsX2F2ZXJhZ2VfTU1fcG5sLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gImJsYWNrIiwgbWFpbiA9ICJPdmVyYWxsIEF2ZXJhZ2UgUE5MIiwgeGxhYiA9ICJQb3NpdGlvbiBpbiBMaXN0IiwgeWxhYiA9ICJWYWx1ZSIsIHlsaW0gPSBjKG1pbihjKG92ZXJhbGxfYXZlcmFnZV9NTV9wbmwsIG92ZXJhbGxfYXZlcmFnZV9JbmZvcm1lZDFfcG5sLCBvdmVyYWxsX2F2ZXJhZ2VfSW5mb3JtZWQyX3BubCwgb3ZlcmFsbF9hdmVyYWdlX0luZm9ybWVkM19wbmwsIG92ZXJhbGxfYXZlcmFnZV9JbmZvcm1lZDRfcG5sLCBvdmVyYWxsX2F2ZXJhZ2VfSW5mb3JtZWQ1X3BubCwgb3ZlcmFsbF9hdmVyYWdlX0luZm9ybWVkNl9wbmwpKSwgbWF4KGMob3ZlcmFsbF9hdmVyYWdlX01NX3BubCwgb3ZlcmFsbF9hdmVyYWdlX0luZm9ybWVkMV9wbmwsIG92ZXJhbGxfYXZlcmFnZV9JbmZvcm1lZDJfcG5sLCBvdmVyYWxsX2F2ZXJhZ2VfSW5mb3JtZWQzX3BubCwgb3ZlcmFsbF9hdmVyYWdlX0luZm9ybWVkNF9wbmwsIG92ZXJhbGxfYXZlcmFnZV9JbmZvcm1lZDVfcG5sLCBvdmVyYWxsX2F2ZXJhZ2VfSW5mb3JtZWQ2X3BubCkpKSkKbGluZXMob3ZlcmFsbF9hdmVyYWdlX0luZm9ybWVkMV9wbmwsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAicmVkIikKbGluZXMob3ZlcmFsbF9hdmVyYWdlX0luZm9ybWVkMl9wbmwsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAiZ3JlZW4iKQpsaW5lcyhvdmVyYWxsX2F2ZXJhZ2VfSW5mb3JtZWQzX3BubCwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJ5ZWxsb3ciKQpsaW5lcyhvdmVyYWxsX2F2ZXJhZ2VfSW5mb3JtZWQ0X3BubCwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJibHVlIikKbGluZXMob3ZlcmFsbF9hdmVyYWdlX0luZm9ybWVkNV9wbmwsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAicHVycGxlIikKbGluZXMob3ZlcmFsbF9hdmVyYWdlX0luZm9ybWVkNl9wbmwsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAib3JhbmdlIikKCiMgQWRkIGxlZ2VuZApsZWdlbmQoImJvdHRvbWxlZnQiLCBsZWdlbmQgPSBjKCJNYXJrZXQgTWFrZXIiLCAiSW5mb3JtZWQgMSIsICJJbmZvcm1lZCAyIiwgIkluZm9ybWVkIDMiLCAiSW5mb3JtZWQgNCIsICJJbmZvcm1lZCA1IiwgIkluZm9ybWVkIDYiKSwgY29sID0gYygiYmxhY2siLCAicmVkIiwgImdyZWVuIiwgInllbGxvdyIsICJibHVlIiwgInB1cnBsZSIsICJvcmFuZ2UiKSwgbHR5ID0gMSwgY2V4ID0gMC44KQpgYGAKCmBgYHtyfQojIEluaXRpYWxpemUgbWF0cmljZXMgdG8gc3RvcmUgYXZlcmFnZXMgZm9yIGVhY2ggcG9zaXRpb24KYXZlcmFnZV9NTV9wb3MgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCmF2ZXJhZ2VfSW5mb3JtZWQxX3BvcyA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9JbmZvcm1lZDJfcG9zIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQphdmVyYWdlX0luZm9ybWVkM19wb3MgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCmF2ZXJhZ2VfSW5mb3JtZWQ0X3BvcyA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9JbmZvcm1lZDVfcG9zIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQphdmVyYWdlX0luZm9ybWVkNl9wb3MgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCgojIExvb3AgdGhyb3VnaCBlYWNoIHNpbXVsYXRpb24gKG4pCmZvciAobiBpbiAxOjEwKSB7CgogIE1NX3Bvc19zZXQxIDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c18xW24sIDddKSksICIsICIpCgogIEluZm9ybWVkMV9wb3Nfc2V0MSA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfMVtuLCA5XSkpLCAiLCAiKQogIAogIEluZm9ybWVkMl9wb3Nfc2V0MSA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfMVtuLCAxMV0pKSwgIiwgIikKICAKICBJbmZvcm1lZDNfcG9zX3NldDEgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzFbbiwgMTNdKSksICIsICIpCiAgCiAgSW5mb3JtZWQ0X3Bvc19zZXQxIDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c18xW24sIDE1XSkpLCAiLCAiKQogIAogIEluZm9ybWVkNV9wb3Nfc2V0MSA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfMVtuLCAxN10pKSwgIiwgIikKICAKICBJbmZvcm1lZDZfcG9zX3NldDEgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzFbbiwgMTldKSksICIsICIpCiAgCiAgIyBMb29wIHRocm91Z2ggZWFjaCBwb3NpdGlvbiAoaSkKICBmb3IgKGkgaW4gMToxMDApIHsKICAgICMgRXh0cmFjdCBUcnVlIGFuZCBFeHBlY3RlZCB2YWx1ZXMgZm9yIHRoZSBpLXRoIHBvc2l0aW9uCiAgICBNTV9wb3MgPC0gc2FwcGx5KE1NX3Bvc19zZXQxLCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgSW5mb3JtZWQxX3BvcyA8LSBzYXBwbHkoSW5mb3JtZWQxX3Bvc19zZXQxLCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgSW5mb3JtZWQyX3BvcyA8LSBzYXBwbHkoSW5mb3JtZWQyX3Bvc19zZXQxLCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgSW5mb3JtZWQzX3BvcyA8LSBzYXBwbHkoSW5mb3JtZWQzX3Bvc19zZXQxLCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgSW5mb3JtZWQ0X3BvcyA8LSBzYXBwbHkoSW5mb3JtZWQ0X3Bvc19zZXQxLCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgSW5mb3JtZWQ1X3BvcyA8LSBzYXBwbHkoSW5mb3JtZWQ1X3Bvc19zZXQxLCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgSW5mb3JtZWQ2X3BvcyA8LSBzYXBwbHkoSW5mb3JtZWQ2X3Bvc19zZXQxLCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgCiAgICAjIENhbGN1bGF0ZSB0aGUgYXZlcmFnZSBvZiBUcnVlIGFuZCBFeHBlY3RlZCB2YWx1ZXMgZm9yIHRoZSBpLXRoIHBvc2l0aW9uCiAgICBhdmVyYWdlX01NX3Bvc1tpLCBuXSA8LSBtZWFuKE1NX3BvcywgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9JbmZvcm1lZDFfcG9zW2ksIG5dIDwtIG1lYW4oSW5mb3JtZWQxX3BvcywgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9JbmZvcm1lZDJfcG9zW2ksIG5dIDwtIG1lYW4oSW5mb3JtZWQyX3BvcywgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9JbmZvcm1lZDNfcG9zW2ksIG5dIDwtIG1lYW4oSW5mb3JtZWQzX3BvcywgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9JbmZvcm1lZDRfcG9zW2ksIG5dIDwtIG1lYW4oSW5mb3JtZWQ0X3BvcywgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9JbmZvcm1lZDVfcG9zW2ksIG5dIDwtIG1lYW4oSW5mb3JtZWQ1X3BvcywgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9JbmZvcm1lZDZfcG9zW2ksIG5dIDwtIG1lYW4oSW5mb3JtZWQ2X3BvcywgbmEucm0gPSBUUlVFKQogIH0KfQoKIyBDYWxjdWxhdGUgdGhlIG92ZXJhbGwgYXZlcmFnZSBmb3IgZWFjaCBwb3NpdGlvbiBhY3Jvc3MgYWxsIHNpbXVsYXRpb25zCm92ZXJhbGxfYXZlcmFnZV9NTV9wb3MgPC0gcm93TWVhbnMoYXZlcmFnZV9NTV9wb3MsIG5hLnJtID0gVFJVRSkKb3ZlcmFsbF9hdmVyYWdlX0luZm9ybWVkMV9wb3MgPC0gcm93TWVhbnMoYXZlcmFnZV9JbmZvcm1lZDFfcG9zLCBuYS5ybSA9IFRSVUUpCm92ZXJhbGxfYXZlcmFnZV9JbmZvcm1lZDJfcG9zIDwtIHJvd01lYW5zKGF2ZXJhZ2VfSW5mb3JtZWQyX3BvcywgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfSW5mb3JtZWQzX3BvcyA8LSByb3dNZWFucyhhdmVyYWdlX0luZm9ybWVkM19wb3MsIG5hLnJtID0gVFJVRSkKb3ZlcmFsbF9hdmVyYWdlX0luZm9ybWVkNF9wb3MgPC0gcm93TWVhbnMoYXZlcmFnZV9JbmZvcm1lZDRfcG9zLCBuYS5ybSA9IFRSVUUpCm92ZXJhbGxfYXZlcmFnZV9JbmZvcm1lZDVfcG9zIDwtIHJvd01lYW5zKGF2ZXJhZ2VfSW5mb3JtZWQ1X3BvcywgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfSW5mb3JtZWQ2X3BvcyA8LSByb3dNZWFucyhhdmVyYWdlX0luZm9ybWVkNl9wb3MsIG5hLnJtID0gVFJVRSkKCiMgUGxvdCB0aGUgb3ZlcmFsbCBhdmVyYWdlcwpwbG90KG92ZXJhbGxfYXZlcmFnZV9NTV9wb3MsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAiYmxhY2siLCBtYWluID0gIk92ZXJhbGwgQXZlcmFnZSBQb3NpdGlvbiIsIHhsYWIgPSAiUG9zaXRpb24gaW4gTGlzdCIsIHlsYWIgPSAiVmFsdWUiLCB5bGltID0gYyhtaW4oYyhvdmVyYWxsX2F2ZXJhZ2VfTU1fcG9zLCBvdmVyYWxsX2F2ZXJhZ2VfSW5mb3JtZWQxX3Bvcywgb3ZlcmFsbF9hdmVyYWdlX0luZm9ybWVkMl9wb3MsIG92ZXJhbGxfYXZlcmFnZV9JbmZvcm1lZDNfcG9zLCBvdmVyYWxsX2F2ZXJhZ2VfSW5mb3JtZWQ0X3Bvcywgb3ZlcmFsbF9hdmVyYWdlX0luZm9ybWVkNV9wb3MsIG92ZXJhbGxfYXZlcmFnZV9JbmZvcm1lZDZfcG9zKSksIG1heChjKG92ZXJhbGxfYXZlcmFnZV9NTV9wb3MsIG92ZXJhbGxfYXZlcmFnZV9JbmZvcm1lZDFfcG9zLCBvdmVyYWxsX2F2ZXJhZ2VfSW5mb3JtZWQyX3Bvcywgb3ZlcmFsbF9hdmVyYWdlX0luZm9ybWVkM19wb3MsIG92ZXJhbGxfYXZlcmFnZV9JbmZvcm1lZDRfcG9zLCBvdmVyYWxsX2F2ZXJhZ2VfSW5mb3JtZWQ1X3Bvcywgb3ZlcmFsbF9hdmVyYWdlX0luZm9ybWVkNl9wb3MpKSkpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV9JbmZvcm1lZDFfcG9zLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gInJlZCIpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV9JbmZvcm1lZDJfcG9zLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gImdyZWVuIikKbGluZXMob3ZlcmFsbF9hdmVyYWdlX0luZm9ybWVkM19wb3MsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAieWVsbG93IikKbGluZXMob3ZlcmFsbF9hdmVyYWdlX0luZm9ybWVkNF9wb3MsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAiYmx1ZSIpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV9JbmZvcm1lZDVfcG9zLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gInB1cnBsZSIpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV9JbmZvcm1lZDZfcG9zLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gIm9yYW5nZSIpCgojIEFkZCBsZWdlbmQKbGVnZW5kKCJib3R0b21sZWZ0IiwgbGVnZW5kID0gYygiTWFya2V0IE1ha2VyIiwgIkluZm9ybWVkIDEiLCAiSW5mb3JtZWQgMiIsICJJbmZvcm1lZCAzIiwgIkluZm9ybWVkIDQiLCAiSW5mb3JtZWQgNSIsICJJbmZvcm1lZCA2IiksIGNvbCA9IGMoImJsYWNrIiwgInJlZCIsICJncmVlbiIsICJ5ZWxsb3ciLCAiYmx1ZSIsICJwdXJwbGUiLCAib3JhbmdlIiksIGx0eSA9IDEsIGNleCA9IDAuOCkKYGBgCgoKCiMjIHNldCAyCgoKIyMgc2V0IDMKCgojIyBzZXQgNCAoMSBpbmZvcm1lZCArIDIgbm9pc3kgaW5mb3JtZWQgKyAyIG5vaXN5ICsgMSBzdG9jaGFzdGljIG5vaXN5KQoKYGBge3J9CiMgSW5pdGlhbGl6ZSBlbXB0eSB2ZWN0b3JzIHRvIHN0b3JlIHRydWUgYW5kIGV4cGVjdGVkIHZhbHVlcwpUcnVlVmFsdWVzX3NldDQgPC0gbnVtZXJpYygpCkV4cGVjdGVkVmFsdWVzX3NldDQgPC0gbnVtZXJpYygpCgojIExvb3AgdGhyb3VnaCBlYWNoIGl0ZXJhdGlvbiAobikKZm9yIChuIGluIDE6MTApIHsKICAjIEV4dHJhY3QgVHJ1ZSB2YWx1ZXMgZnJvbSB0aGUgYWdncmVnYXRlZF9yZXN1bHRzXzEgZGF0YWZyYW1lCiAgVHJ1ZVZhbHVlX3NldDQgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzRbbiwgMl0pKSwgIiwgIilbWzFdXQogIAogICMgRXh0cmFjdCBFeHBlY3RlZCB2YWx1ZXMgZnJvbSB0aGUgYWdncmVnYXRlZF9yZXN1bHRzXzEgZGF0YWZyYW1lCiAgRXhwZWN0ZWRWYWx1ZV9zZXQ0IDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c180W24sIDNdKSksICIsICIpW1sxXV0KICAKICAjIEFwcGVuZCB0aGUgVHJ1ZSBhbmQgRXhwZWN0ZWQgdmFsdWVzIHRvIHRoZWlyIHJlc3BlY3RpdmUgdmVjdG9ycwogIFRydWVWYWx1ZXNfc2V0NCA8LSBjKFRydWVWYWx1ZXNfc2V0NCwgYXMubnVtZXJpYyhUcnVlVmFsdWVfc2V0NCkpCiAgRXhwZWN0ZWRWYWx1ZXNfc2V0NCA8LSBjKEV4cGVjdGVkVmFsdWVzX3NldDQsIGFzLm51bWVyaWMoRXhwZWN0ZWRWYWx1ZV9zZXQ0KSkKfQoKIyBDYWxjdWxhdGUgdGhlIGF2ZXJhZ2Ugb2YgVHJ1ZSB2YWx1ZXMKYXZlcmFnZV90cnVlIDwtIG1lYW4oVHJ1ZVZhbHVlc19zZXQ0KQoKIyBDYWxjdWxhdGUgdGhlIGF2ZXJhZ2Ugb2YgRXhwZWN0ZWQgdmFsdWVzCmF2ZXJhZ2VfZXhwZWN0ZWQgPC0gbWVhbihFeHBlY3RlZFZhbHVlc19zZXQ0KQoKIyBQbG90IFRydWUgYW5kIEV4cGVjdGVkIHZhbHVlcyBvbiB0aGUgc2FtZSBwbG90CnBsb3QoVHJ1ZVZhbHVlc19zZXQ0LCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gImJsdWUiLCBtYWluID0gIlRydWUgdnMgRXhwZWN0ZWQgVmFsdWVzIGluIHNldCA0IiwgeGxhYiA9ICJJdGVyYXRpb24iLCB5bGFiID0gIlZhbHVlIikKbGluZXMoRXhwZWN0ZWRWYWx1ZXNfc2V0NCwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJyZWQiKQoKIyBBZGQgbGVnZW5kCmxlZ2VuZCgidG9wcmlnaHQiLCBsZWdlbmQgPSBjKCJUcnVlIFZhbHVlcyIsICJFeHBlY3RlZCBWYWx1ZXMiKSwgY29sID0gYygiYmx1ZSIsICJyZWQiKSwgbHR5ID0gMSwgY2V4ID0gMC44KQoKIyBBZGQgaG9yaXpvbnRhbCBsaW5lcyBmb3IgdGhlIGF2ZXJhZ2VzCmFibGluZShoID0gYXZlcmFnZV90cnVlLCBjb2wgPSAiYmx1ZSIsIGx3ZCA9IDEpCmFibGluZShoID0gYXZlcmFnZV9leHBlY3RlZCwgY29sID0gInJlZCIsIGx3ZCA9IDEpCmBgYAoKYGBge3J9CiMgSW5pdGlhbGl6ZSBtYXRyaWNlcyB0byBzdG9yZSBhdmVyYWdlcyBmb3IgZWFjaCBwb3NpdGlvbgphdmVyYWdlX3RydWUgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCmF2ZXJhZ2VfZXhwZWN0ZWQgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCgojIExvb3AgdGhyb3VnaCBlYWNoIHNpbXVsYXRpb24gKG4pCmZvciAobiBpbiAxOjEwKSB7CiAgIyBFeHRyYWN0IFRydWUgdmFsdWVzIGZyb20gdGhlIGFnZ3JlZ2F0ZWRfcmVzdWx0c180IGRhdGFmcmFtZQogIFRydWVWYWx1ZXNfc2V0NCA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfNFtuLCAyXSkpLCAiLCAiKQogIAogICMgRXh0cmFjdCBFeHBlY3RlZCB2YWx1ZXMgZnJvbSB0aGUgYWdncmVnYXRlZF9yZXN1bHRzXzQgZGF0YWZyYW1lCiAgRXhwZWN0ZWRWYWx1ZXNfc2V0NCA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfNFtuLCAzXSkpLCAiLCAiKQogIAogICMgTG9vcCB0aHJvdWdoIGVhY2ggcG9zaXRpb24gKGkpCiAgZm9yIChpIGluIDE6MTAwKSB7CiAgICAjIEV4dHJhY3QgVHJ1ZSBhbmQgRXhwZWN0ZWQgdmFsdWVzIGZvciB0aGUgaS10aCBwb3NpdGlvbgogICAgVHJ1ZV92YWx1ZXMgPC0gc2FwcGx5KFRydWVWYWx1ZXNfc2V0NCwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIEV4cGVjdGVkX3ZhbHVlcyA8LSBzYXBwbHkoRXhwZWN0ZWRWYWx1ZXNfc2V0NCwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIAogICAgIyBDYWxjdWxhdGUgdGhlIGF2ZXJhZ2Ugb2YgVHJ1ZSBhbmQgRXhwZWN0ZWQgdmFsdWVzIGZvciB0aGUgaS10aCBwb3NpdGlvbgogICAgYXZlcmFnZV90cnVlW2ksIG5dIDwtIG1lYW4oVHJ1ZV92YWx1ZXMsIG5hLnJtID0gVFJVRSkKICAgIGF2ZXJhZ2VfZXhwZWN0ZWRbaSwgbl0gPC0gbWVhbihFeHBlY3RlZF92YWx1ZXMsIG5hLnJtID0gVFJVRSkKICB9Cn0KCiMgQ2FsY3VsYXRlIHRoZSBvdmVyYWxsIGF2ZXJhZ2UgZm9yIGVhY2ggcG9zaXRpb24gYWNyb3NzIGFsbCBzaW11bGF0aW9ucwpvdmVyYWxsX2F2ZXJhZ2VfdHJ1ZSA8LSByb3dNZWFucyhhdmVyYWdlX3RydWUsIG5hLnJtID0gVFJVRSkKb3ZlcmFsbF9hdmVyYWdlX2V4cGVjdGVkIDwtIHJvd01lYW5zKGF2ZXJhZ2VfZXhwZWN0ZWQsIG5hLnJtID0gVFJVRSkKCiMgUGxvdCB0aGUgb3ZlcmFsbCBhdmVyYWdlcwpwbG90KG92ZXJhbGxfYXZlcmFnZV90cnVlLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gImJsdWUiLCBtYWluID0gIk92ZXJhbGwgQXZlcmFnZSBvZiBUcnVlIHZzIEV4cGVjdGVkIFZhbHVlcyIsIHhsYWIgPSAiUG9zaXRpb24gaW4gTGlzdCIsIHlsYWIgPSAiVmFsdWUiLCB5bGltID0gYyhtaW4oYyhvdmVyYWxsX2F2ZXJhZ2VfdHJ1ZSwgb3ZlcmFsbF9hdmVyYWdlX2V4cGVjdGVkKSksIG1heChjKG92ZXJhbGxfYXZlcmFnZV90cnVlLCBvdmVyYWxsX2F2ZXJhZ2VfZXhwZWN0ZWQpKSkpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV9leHBlY3RlZCwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJyZWQiKQpsZWdlbmQoInRvcHJpZ2h0IiwgbGVnZW5kID0gYygiVHJ1ZSBWYWx1ZXMiLCAiRXhwZWN0ZWQgVmFsdWVzIiksIGNvbCA9IGMoImJsdWUiLCAicmVkIiksIGx0eSA9IDEsIGNleCA9IDAuOCkKCmBgYAoKCgoKYGBge3J9CiMgSW5pdGlhbGl6ZSBlbXB0eSB2ZWN0b3JzIHRvIHN0b3JlIHRoZSBCaWQgYW5kIEFzayB2YWx1ZXMKQmlkc19zZXQ0IDwtIG51bWVyaWMoKQpBc2tzX3NldDQgPC0gbnVtZXJpYygpCgojIExvb3AgdGhyb3VnaCBlYWNoIGl0ZXJhdGlvbiAobikKZm9yIChuIGluIDE6MTApIHsKICAjIEV4dHJhY3QgQmlkIHZhbHVlcyBmcm9tIHRoZSBhZ2dyZWdhdGVkX3Jlc3VsdHNfMSBkYXRhZnJhbWUKICBCaWRfc2V0NCA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfNFtuLCA0XSkpLCAiLCAiKVtbMV1dCiAgCiAgIyBFeHRyYWN0IEFzayB2YWx1ZXMgZnJvbSB0aGUgYWdncmVnYXRlZF9yZXN1bHRzXzEgZGF0YWZyYW1lIChuZXh0IGNvbHVtbikKICBBc2tfc2V0NCA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfNFtuLCA1XSkpLCAiLCAiKVtbMV1dCiAgCiAgIyBBcHBlbmQgdGhlIEJpZCBhbmQgQXNrIHZhbHVlcyB0byB0aGVpciByZXNwZWN0aXZlIHZlY3RvcnMKICBCaWRzX3NldDQgPC0gYyhCaWRzX3NldDQsIGFzLm51bWVyaWMoQmlkX3NldDQpKQogIEFza3Nfc2V0NCA8LSBjKEFza3Nfc2V0NCwgYXMubnVtZXJpYyhBc2tfc2V0NCkpCn0KCiMgQ2FsY3VsYXRlIHRoZSBhdmVyYWdlIG9mIEJpZCBhbmQgQXNrIHZhbHVlcwphdmVyYWdlX2JpZHMgPC0gbWVhbihCaWRzX3NldDQsIG5hLnJtID0gVFJVRSkKYXZlcmFnZV9hc2tzIDwtIG1lYW4oQXNrc19zZXQ0LCBuYS5ybSA9IFRSVUUpCgojIFBsb3QgdGhlIEJpZCBhbmQgQXNrIHZhbHVlcyBvbiB0aGUgc2FtZSBwbG90CnBsb3QoQmlkc19zZXQ0LCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gImJsdWUiLCBtYWluID0gIkJpZHMgdnMgQXNrcyBpbiBzZXQgNCIsIHhsYWIgPSAiSXRlcmF0aW9uIiwgeWxhYiA9ICJWYWx1ZSIsIHlsaW0gPSBjKG1pbihjKEJpZHNfc2V0NCwgQXNrc19zZXQ0KSksIG1heChjKEJpZHNfc2V0NCwgQXNrc19zZXQ0KSkpKQpsaW5lcyhBc2tzX3NldDQsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAicmVkIikKCiMgQWRkIGxlZ2VuZApsZWdlbmQoInRvcHJpZ2h0IiwgbGVnZW5kID0gYygiQmlkcyIsICJBc2tzIiksIGNvbCA9IGMoImJsdWUiLCAicmVkIiksIGx0eSA9IDEsIGNleCA9IDAuOCkKCiMgQWRkIGhvcml6b250YWwgbGluZXMgZm9yIHRoZSBhdmVyYWdlcwphYmxpbmUoaCA9IGF2ZXJhZ2VfYmlkcywgY29sID0gImJsdWUiLCBsdHkgPSAxKQphYmxpbmUoaCA9IGF2ZXJhZ2VfYXNrcywgY29sID0gInJlZCIsIGx0eSA9IDEpCmBgYAoKCmBgYHtyfQojIEluaXRpYWxpemUgbWF0cmljZXMgdG8gc3RvcmUgYXZlcmFnZXMgZm9yIGVhY2ggcG9zaXRpb24KYXZlcmFnZV9iaWQgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCmF2ZXJhZ2VfYXNrIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQoKIyBMb29wIHRocm91Z2ggZWFjaCBzaW11bGF0aW9uIChuKQpmb3IgKG4gaW4gMToxMCkgewogICMgRXh0cmFjdCBUcnVlIHZhbHVlcyBmcm9tIHRoZSBhZ2dyZWdhdGVkX3Jlc3VsdHNfNCBkYXRhZnJhbWUKICBCaWRzX3NldDQgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzRbbiwgNF0pKSwgIiwgIikKICAKICAjIEV4dHJhY3QgRXhwZWN0ZWQgdmFsdWVzIGZyb20gdGhlIGFnZ3JlZ2F0ZWRfcmVzdWx0c180IGRhdGFmcmFtZQogIEFza3Nfc2V0NCA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfNFtuLCA1XSkpLCAiLCAiKQogIAogICMgTG9vcCB0aHJvdWdoIGVhY2ggcG9zaXRpb24gKGkpCiAgZm9yIChpIGluIDE6MTAwKSB7CiAgICAjIEV4dHJhY3QgVHJ1ZSBhbmQgRXhwZWN0ZWQgdmFsdWVzIGZvciB0aGUgaS10aCBwb3NpdGlvbgogICAgQmlkcyA8LSBzYXBwbHkoQmlkc19zZXQ0LCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgQXNrcyA8LSBzYXBwbHkoQXNrc19zZXQ0LCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgCiAgICAjIENhbGN1bGF0ZSB0aGUgYXZlcmFnZSBvZiBUcnVlIGFuZCBFeHBlY3RlZCB2YWx1ZXMgZm9yIHRoZSBpLXRoIHBvc2l0aW9uCiAgICBhdmVyYWdlX2JpZFtpLCBuXSA8LSBtZWFuKEJpZHMsIG5hLnJtID0gVFJVRSkKICAgIGF2ZXJhZ2VfYXNrW2ksIG5dIDwtIG1lYW4oQXNrcywgbmEucm0gPSBUUlVFKQogIH0KfQoKIyBDYWxjdWxhdGUgdGhlIG92ZXJhbGwgYXZlcmFnZSBmb3IgZWFjaCBwb3NpdGlvbiBhY3Jvc3MgYWxsIHNpbXVsYXRpb25zCm92ZXJhbGxfYXZlcmFnZV9iaWQgPC0gcm93TWVhbnMoYXZlcmFnZV9iaWQsIG5hLnJtID0gVFJVRSkKb3ZlcmFsbF9hdmVyYWdlX2FzayA8LSByb3dNZWFucyhhdmVyYWdlX2FzaywgbmEucm0gPSBUUlVFKQoKIyBQbG90IHRoZSBvdmVyYWxsIGF2ZXJhZ2VzCnBsb3Qob3ZlcmFsbF9hdmVyYWdlX2JpZCwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJibHVlIiwgbWFpbiA9ICJPdmVyYWxsIEF2ZXJhZ2Ugb2YgQmlkcyB2cyBBc2tzIiwgeGxhYiA9ICJQb3NpdGlvbiBpbiBMaXN0IiwgeWxhYiA9ICJWYWx1ZSIsIHlsaW0gPSBjKG1pbihjKG92ZXJhbGxfYXZlcmFnZV9iaWQsIG92ZXJhbGxfYXZlcmFnZV9hc2spKSwgbWF4KGMob3ZlcmFsbF9hdmVyYWdlX2JpZCwgb3ZlcmFsbF9hdmVyYWdlX2FzaykpKSkKbGluZXMob3ZlcmFsbF9hdmVyYWdlX2FzaywgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJyZWQiKQpsZWdlbmQoInRvcHJpZ2h0IiwgbGVnZW5kID0gYygiQmlkcyIsICJBc2tzIiksIGNvbCA9IGMoImJsdWUiLCAicmVkIiksIGx0eSA9IDEsIGNleCA9IDAuOCkKYGBgCgoKCmBgYHtyfQojIEluaXRpYWxpemUgZW1wdHkgdmVjdG9ycyB0byBzdG9yZSB0aGUgQmlkIGFuZCBBc2sgdmFsdWVzCk1NX3BubF9zZXQ0IDwtIG51bWVyaWMoKQpJbmZvcm1lZF9wbmxfc2V0NCA8LSBudW1lcmljKCkKTm9pc3lJbmZvcm1lZDFfcG5sX3NldDQgPC0gbnVtZXJpYygpCk5vaXN5SW5mb3JtZWQyX3BubF9zZXQ0IDwtIG51bWVyaWMoKQpOb2lzeTFfcG5sX3NldDQgPC0gbnVtZXJpYygpCk5vaXN5Ml9wbmxfc2V0NCA8LSBudW1lcmljKCkKU3RvY2hOb2lzeV9wbmxfc2V0NCA8LSBudW1lcmljKCkKCiMgTG9vcCB0aHJvdWdoIGVhY2ggaXRlcmF0aW9uIChuKQpmb3IgKG4gaW4gMToxMCkgewoKICBNTV9wbmxfdmFsdWVzIDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c180W24sIDZdKSksICIsICIpW1sxXV0KICAKICBJbmZvcm1lZF9wbmxfdmFsdWVzIDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c180W24sIDhdKSksICIsICIpW1sxXV0KICAKICBOb2lzeUluZm9ybWVkMV9wbmxfdmFsdWVzIDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c180W24sIDEwXSkpLCAiLCAiKVtbMV1dCiAgCiAgTm9pc3lJbmZvcm1lZDJfcG5sX3ZhbHVlcyA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfNFtuLCAxMl0pKSwgIiwgIilbWzFdXQogIAogIE5vaXN5MV9wbmxfdmFsdWVzIDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c180W24sIDE0XSkpLCAiLCAiKVtbMV1dCiAgCiAgTm9pc3kyX3BubF92YWx1ZXMgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzRbbiwgMTZdKSksICIsICIpW1sxXV0KICAKICBTdG9jaE5vaXN5X3BubF92YWx1ZXMgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzRbbiwgMThdKSksICIsICIpW1sxXV0KICAKICAjIENvbnZlcnQgQmlkIGFuZCBBc2sgdmFsdWVzIHRvIG51bWVyaWMgYW5kIGFwcGVuZCB0byB0aGUgdmVjdG9ycwogIE1NX3BubF9zZXQ0IDwtIGMoTU1fcG5sX3NldDQsIGFzLm51bWVyaWMoTU1fcG5sX3ZhbHVlcykpCiAgSW5mb3JtZWRfcG5sX3NldDQgPC0gYyhJbmZvcm1lZF9wbmxfc2V0NCwgYXMubnVtZXJpYyhJbmZvcm1lZF9wbmxfdmFsdWVzKSkKICBOb2lzeUluZm9ybWVkMV9wbmxfc2V0NCA8LSBjKE5vaXN5SW5mb3JtZWQxX3BubF9zZXQ0LCBhcy5udW1lcmljKE5vaXN5SW5mb3JtZWQxX3BubF92YWx1ZXMpKQogIE5vaXN5SW5mb3JtZWQyX3BubF9zZXQ0IDwtIGMoTm9pc3lJbmZvcm1lZDJfcG5sX3NldDQsIGFzLm51bWVyaWMoTm9pc3lJbmZvcm1lZDJfcG5sX3ZhbHVlcykpCiAgTm9pc3kxX3BubF9zZXQ0IDwtIGMoTm9pc3lfcG5sX3NldDQsIGFzLm51bWVyaWMoTm9pc3kxX3BubF92YWx1ZXMpKQogIE5vaXN5Ml9wbmxfc2V0NCA8LSBjKE5vaXN5Ml9wbmxfc2V0NCwgYXMubnVtZXJpYyhOb2lzeTJfcG5sX3ZhbHVlcykpCiAgU3RvY2hOb2lzeV9wbmxfc2V0NCA8LSBjKFN0b2NoTm9pc3lfcG5sX3NldDQsIGFzLm51bWVyaWMoU3RvY2hOb2lzeV9wbmxfdmFsdWVzKSkKfQoKIyBDYWxjdWxhdGUgdGhlIGF2ZXJhZ2Ugb2YgQmlkIGFuZCBBc2sgdmFsdWVzCiNhdmVyYWdlX01NIDwtIG1lYW4oTU1fc2V0NCwgbmEucm0gPSBUUlVFKQojYXZlcmFnZV9JTiA8LSBtZWFuKElOX3NldDQsIG5hLnJtID0gVFJVRSkKCiMgUGxvdCB0aGUgQmlkIGFuZCBBc2sgdmFsdWVzIG9uIHRoZSBzYW1lIHBsb3QKcGxvdChNTV9wbmxfc2V0NCwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJibGFjayIsIG1haW4gPSAiUE5MIGluIHNldCA0IiwgeGxhYiA9ICJJdGVyYXRpb24iLCB5bGFiID0gIlZhbHVlIiwgeWxpbSA9IGMobWluKGMoTU1fcG5sX3NldDQsIEluZm9ybWVkX3BubF9zZXQ0LCBOb2lzeUluZm9ybWVkMV9wbmxfc2V0NCwgTm9pc3lJbmZvcm1lZDJfcG5sX3NldDQsIE5vaXN5MV9wbmxfc2V0NCwgTm9pc3kyX3BubF9zZXQ0LCBTdG9jaE5vaXN5X3BubF9zZXQ0KSksIG1heChjKE1NX3BubF9zZXQ0LCBJbmZvcm1lZF9wbmxfc2V0NCwgTm9pc3lJbmZvcm1lZDFfcG5sX3NldDQsIE5vaXN5SW5mb3JtZWQyX3BubF9zZXQ0LCBOb2lzeTFfcG5sX3NldDQsIE5vaXN5Ml9wbmxfc2V0NCwgU3RvY2hOb2lzeV9wbmxfc2V0NCkpKSkKbGluZXMoSW5mb3JtZWRfcG5sX3NldDQsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAicmVkIikKbGluZXMoTm9pc3lJbmZvcm1lZDFfcG5sX3NldDQsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAiZ3JlZW4iKQpsaW5lcyhOb2lzeUluZm9ybWVkMl9wbmxfc2V0NCwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJ5ZWxsb3ciKQpsaW5lcyhOb2lzeTFfcG5sX3NldDQsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAiYmx1ZSIpCmxpbmVzKE5vaXN5Ml9wbmxfc2V0NCwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJwdXJwbGUiKQpsaW5lcyhTdG9jaE5vaXN5X3BubF9zZXQ0LCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gIm9yYW5nZSIpCgoKIyBBZGQgbGVnZW5kCmxlZ2VuZCgiYm90dG9tcmlnaHQiLCBsZWdlbmQgPSBjKCJNYXJrZXQgTWFrZXIiLCAiSW5mb3JtZWQiLCAiTm9pc3kgSW5mb3JtZWQgMSIsICJOb2lzeSBJbmZvcm1lZCAyIiwgIk5vaXN5IDEiLCAiTm9pc3kgMiIsICJTdG9jaGFzdGljIE5vaXN5IiksIGNvbCA9IGMoImJsYWNrIiwgInJlZCIsICJncmVlbiIsICJ5ZWxsb3ciLCAiYmx1ZSIsICJwdXJwbGUiLCAib3JhbmdlIiksIGx0eSA9IDEsIGNleCA9IDAuOCkKCiMgQWRkIGhvcml6b250YWwgbGluZXMgZm9yIHRoZSBhdmVyYWdlcwojYWJsaW5lKGggPSBhdmVyYWdlX01NLCBjb2wgPSAiYmx1ZSIsIGx0eSA9IDEpCiNhYmxpbmUoaCA9IGF2ZXJhZ2VfSU4sIGNvbCA9ICJyZWQiLCBsdHkgPSAxKQoKYGBgCgpgYGB7cn0KIyBJbml0aWFsaXplIG1hdHJpY2VzIHRvIHN0b3JlIGF2ZXJhZ2VzIGZvciBlYWNoIHBvc2l0aW9uCmF2ZXJhZ2VfTU1fcG5sIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQphdmVyYWdlX0luZm9ybWVkX3BubCA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9Ob2lzeUluZm9ybWVkMV9wbmwgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCmF2ZXJhZ2VfTm9pc3lJbmZvcm1lZDJfcG5sIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQphdmVyYWdlX05vaXN5MV9wbmwgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCmF2ZXJhZ2VfTm9pc3kyX3BubCA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9TdG9jaE5vaXN5X3BubCA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKCiMgTG9vcCB0aHJvdWdoIGVhY2ggc2ltdWxhdGlvbiAobikKZm9yIChuIGluIDE6MTApIHsKCiAgTU1fcG5sX3NldDQgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzRbbiwgNl0pKSwgIiwgIikKCiAgSW5mb3JtZWRfcG5sX3NldDQgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzRbbiwgOF0pKSwgIiwgIikKICAKICBOb2lzeUluZm9ybWVkMV9wbmxfc2V0NCA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfNFtuLCAxMF0pKSwgIiwgIikKICAKICBOb2lzeUluZm9ybWVkMl9wbmxfc2V0NCA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfNFtuLCAxMl0pKSwgIiwgIikKICAKICBOb2lzeTFfcG5sX3NldDQgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzRbbiwgMTRdKSksICIsICIpCiAgCiAgTm9pc3kyX3BubF9zZXQ0IDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c180W24sIDE2XSkpLCAiLCAiKQogIAogIFN0b2NoTm9pc3lfcG5sX3NldDQgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzRbbiwgMThdKSksICIsICIpCiAgCiAgIyBMb29wIHRocm91Z2ggZWFjaCBwb3NpdGlvbiAoaSkKICBmb3IgKGkgaW4gMToxMDApIHsKICAgICMgRXh0cmFjdCBUcnVlIGFuZCBFeHBlY3RlZCB2YWx1ZXMgZm9yIHRoZSBpLXRoIHBvc2l0aW9uCiAgICBNTV9wbmwgPC0gc2FwcGx5KE1NX3BubF9zZXQ0LCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgSW5mb3JtZWRfcG5sIDwtIHNhcHBseShJbmZvcm1lZF9wbmxfc2V0NCwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIE5vaXN5SW5mb3JtZWQxX3BubCA8LSBzYXBwbHkoTm9pc3lJbmZvcm1lZDFfcG5sX3NldDQsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICBOb2lzeUluZm9ybWVkMl9wbmwgPC0gc2FwcGx5KE5vaXN5SW5mb3JtZWQyX3BubF9zZXQ0LCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgTm9pc3kxX3BubCA8LSBzYXBwbHkoTm9pc3kxX3BubF9zZXQ0LCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgTm9pc3kyX3BubCA8LSBzYXBwbHkoTm9pc3kyX3BubF9zZXQ0LCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgU3RvY2hOb2lzeV9wbmwgPC0gc2FwcGx5KFN0b2NoTm9pc3lfcG5sX3NldDQsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICAKICAgICMgQ2FsY3VsYXRlIHRoZSBhdmVyYWdlIG9mIFRydWUgYW5kIEV4cGVjdGVkIHZhbHVlcyBmb3IgdGhlIGktdGggcG9zaXRpb24KICAgIGF2ZXJhZ2VfTU1fcG5sW2ksIG5dIDwtIG1lYW4oTU1fcG5sLCBuYS5ybSA9IFRSVUUpCiAgICBhdmVyYWdlX0luZm9ybWVkX3BubFtpLCBuXSA8LSBtZWFuKEluZm9ybWVkX3BubCwgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9Ob2lzeUluZm9ybWVkMV9wbmxbaSwgbl0gPC0gbWVhbihOb2lzeUluZm9ybWVkMV9wbmwsIG5hLnJtID0gVFJVRSkKICAgIGF2ZXJhZ2VfTm9pc3lJbmZvcm1lZDJfcG5sW2ksIG5dIDwtIG1lYW4oTm9pc3lJbmZvcm1lZDJfcG5sLCBuYS5ybSA9IFRSVUUpCiAgICBhdmVyYWdlX05vaXN5MV9wbmxbaSwgbl0gPC0gbWVhbihOb2lzeTFfcG5sLCBuYS5ybSA9IFRSVUUpCiAgICBhdmVyYWdlX05vaXN5Ml9wbmxbaSwgbl0gPC0gbWVhbihOb2lzeTJfcG5sLCBuYS5ybSA9IFRSVUUpCiAgICBhdmVyYWdlX1N0b2NoTm9pc3lfcG5sW2ksIG5dIDwtIG1lYW4oU3RvY2hOb2lzeV9wbmwsIG5hLnJtID0gVFJVRSkKICB9Cn0KCiMgQ2FsY3VsYXRlIHRoZSBvdmVyYWxsIGF2ZXJhZ2UgZm9yIGVhY2ggcG9zaXRpb24gYWNyb3NzIGFsbCBzaW11bGF0aW9ucwpvdmVyYWxsX2F2ZXJhZ2VfTU1fcG5sIDwtIHJvd01lYW5zKGF2ZXJhZ2VfTU1fcG5sLCBuYS5ybSA9IFRSVUUpCm92ZXJhbGxfYXZlcmFnZV9JbmZvcm1lZF9wbmwgPC0gcm93TWVhbnMoYXZlcmFnZV9JbmZvcm1lZF9wbmwsIG5hLnJtID0gVFJVRSkKb3ZlcmFsbF9hdmVyYWdlX05vaXN5SW5mb3JtZWQxX3BubCA8LSByb3dNZWFucyhhdmVyYWdlX05vaXN5SW5mb3JtZWQxX3BubCwgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfTm9pc3lJbmZvcm1lZDJfcG5sIDwtIHJvd01lYW5zKGF2ZXJhZ2VfTm9pc3lJbmZvcm1lZDJfcG5sLCBuYS5ybSA9IFRSVUUpCm92ZXJhbGxfYXZlcmFnZV9Ob2lzeTFfcG5sIDwtIHJvd01lYW5zKGF2ZXJhZ2VfTm9pc3kxX3BubCwgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfTm9pc3kyX3BubCA8LSByb3dNZWFucyhhdmVyYWdlX05vaXN5Ml9wbmwsIG5hLnJtID0gVFJVRSkKb3ZlcmFsbF9hdmVyYWdlX1N0b2NoTm9pc3lfcG5sIDwtIHJvd01lYW5zKGF2ZXJhZ2VfU3RvY2hOb2lzeV9wbmwsIG5hLnJtID0gVFJVRSkKCiMgUGxvdCB0aGUgb3ZlcmFsbCBhdmVyYWdlcwpwbG90KG92ZXJhbGxfYXZlcmFnZV9NTV9wbmwsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAiYmxhY2siLCBtYWluID0gIk92ZXJhbGwgQXZlcmFnZSBQTkwiLCB4bGFiID0gIlBvc2l0aW9uIGluIExpc3QiLCB5bGFiID0gIlZhbHVlIiwgeWxpbSA9IGMobWluKGMob3ZlcmFsbF9hdmVyYWdlX01NX3BubCwgb3ZlcmFsbF9hdmVyYWdlX0luZm9ybWVkX3BubCwgb3ZlcmFsbF9hdmVyYWdlX05vaXN5SW5mb3JtZWQxX3BubCwgb3ZlcmFsbF9hdmVyYWdlX05vaXN5SW5mb3JtZWQyX3BubCwgb3ZlcmFsbF9hdmVyYWdlX05vaXN5MV9wbmwsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeTJfcG5sLCBvdmVyYWxsX2F2ZXJhZ2VfU3RvY2hOb2lzeV9wbmwpKSwgbWF4KGMob3ZlcmFsbF9hdmVyYWdlX01NX3BubCwgb3ZlcmFsbF9hdmVyYWdlX0luZm9ybWVkX3BubCwgb3ZlcmFsbF9hdmVyYWdlX05vaXN5SW5mb3JtZWQxX3BubCwgb3ZlcmFsbF9hdmVyYWdlX05vaXN5SW5mb3JtZWQyX3BubCwgb3ZlcmFsbF9hdmVyYWdlX05vaXN5MV9wbmwsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeTJfcG5sLCBvdmVyYWxsX2F2ZXJhZ2VfU3RvY2hOb2lzeV9wbmwpKSkpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV9JbmZvcm1lZF9wbmwsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAicmVkIikKbGluZXMob3ZlcmFsbF9hdmVyYWdlX05vaXN5SW5mb3JtZWQxX3BubCwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJncmVlbiIpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV9Ob2lzeUluZm9ybWVkMl9wbmwsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAieWVsbG93IikKbGluZXMob3ZlcmFsbF9hdmVyYWdlX05vaXN5MV9wbmwsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAiYmx1ZSIpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV9Ob2lzeTJfcG5sLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gInB1cnBsZSIpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV9TdG9jaE5vaXN5X3BubCwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJvcmFuZ2UiKQoKIyBBZGQgbGVnZW5kCmxlZ2VuZCgiYm90dG9tbGVmdCIsIGxlZ2VuZCA9IGMoIk1hcmtldCBNYWtlciIsICJJbmZvcm1lZCIsICJOb2lzeSBJbmZvcm1lZCAxIiwgIk5vaXN5IEluZm9ybWVkIDIiLCAiTm9pc3kgMSIsICJOb2lzeSAyIiwgIlN0b2NoYXN0aWMgTm9pc3kiKSwgY29sID0gYygiYmxhY2siLCAicmVkIiwgImdyZWVuIiwgInllbGxvdyIsICJibHVlIiwgInB1cnBsZSIsICJvcmFuZ2UiKSwgbHR5ID0gMSwgY2V4ID0gMC44KQpgYGAKCgpgYGB7cn0KIyBJbml0aWFsaXplIGVtcHR5IHZlY3RvcnMgdG8gc3RvcmUgdGhlIEJpZCBhbmQgQXNrIHZhbHVlcwpNTV9wb3Nfc2V0NCA8LSBudW1lcmljKCkKSW5mb3JtZWRfcG9zX3NldDQgPC0gbnVtZXJpYygpCk5vaXN5SW5mb3JtZWQxX3Bvc19zZXQ0IDwtIG51bWVyaWMoKQpOb2lzeUluZm9ybWVkMl9wb3Nfc2V0NCA8LSBudW1lcmljKCkKTm9pc3kxX3Bvc19zZXQ0IDwtIG51bWVyaWMoKQpOb2lzeTJfcG9zX3NldDQgPC0gbnVtZXJpYygpClN0b2NoTm9pc3lfcG9zX3NldDQgPC0gbnVtZXJpYygpCgojIExvb3AgdGhyb3VnaCBlYWNoIGl0ZXJhdGlvbiAobikKZm9yIChuIGluIDE6MTApIHsKCiAgTU1fcG9zX3ZhbHVlcyA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfNFtuLCA3XSkpLCAiLCAiKVtbMV1dCiAgCiAgSW5mb3JtZWRfcG9zX3ZhbHVlcyA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfNFtuLCA5XSkpLCAiLCAiKVtbMV1dCiAgCiAgTm9pc3lJbmZvcm1lZDFfcG9zX3ZhbHVlcyA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfNFtuLCAxMV0pKSwgIiwgIilbWzFdXQogIAogIE5vaXN5SW5mb3JtZWQyX3Bvc192YWx1ZXMgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzRbbiwgMTNdKSksICIsICIpW1sxXV0KICAKICBOb2lzeTFfcG9zX3ZhbHVlcyA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfNFtuLCAxNV0pKSwgIiwgIilbWzFdXQogIAogIE5vaXN5Ml9wb3NfdmFsdWVzIDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c180W24sIDE3XSkpLCAiLCAiKVtbMV1dCiAgCiAgU3RvY2hOb2lzeV9wb3NfdmFsdWVzIDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c180W24sIDE5XSkpLCAiLCAiKVtbMV1dCiAgCiAgIyBDb252ZXJ0IEJpZCBhbmQgQXNrIHZhbHVlcyB0byBudW1lcmljIGFuZCBhcHBlbmQgdG8gdGhlIHZlY3RvcnMKICBNTV9wb3Nfc2V0NCA8LSBjKE1NX3Bvc19zZXQ0LCBhcy5udW1lcmljKE1NX3Bvc192YWx1ZXMpKQogIEluZm9ybWVkX3Bvc19zZXQ0IDwtIGMoSW5mb3JtZWRfcG9zX3NldDQsIGFzLm51bWVyaWMoSW5mb3JtZWRfcG9zX3ZhbHVlcykpCiAgTm9pc3lJbmZvcm1lZDFfcG9zX3NldDQgPC0gYyhOb2lzeUluZm9ybWVkMV9wb3Nfc2V0NCwgYXMubnVtZXJpYyhOb2lzeUluZm9ybWVkMV9wb3NfdmFsdWVzKSkKICBOb2lzeUluZm9ybWVkMl9wb3Nfc2V0NCA8LSBjKE5vaXN5SW5mb3JtZWQyX3Bvc19zZXQ0LCBhcy5udW1lcmljKE5vaXN5SW5mb3JtZWQyX3Bvc192YWx1ZXMpKQogIE5vaXN5MV9wb3Nfc2V0NCA8LSBjKE5vaXN5X3Bvc19zZXQ0LCBhcy5udW1lcmljKE5vaXN5MV9wb3NfdmFsdWVzKSkKICBOb2lzeTJfcG9zX3NldDQgPC0gYyhOb2lzeTJfcG9zX3NldDQsIGFzLm51bWVyaWMoTm9pc3kyX3Bvc192YWx1ZXMpKQogIFN0b2NoTm9pc3lfcG9zX3NldDQgPC0gYyhTdG9jaE5vaXN5X3Bvc19zZXQ0LCBhcy5udW1lcmljKFN0b2NoTm9pc3lfcG9zX3ZhbHVlcykpCn0KCiMgQ2FsY3VsYXRlIHRoZSBhdmVyYWdlIG9mIEJpZCBhbmQgQXNrIHZhbHVlcwojYXZlcmFnZV9NTSA8LSBtZWFuKE1NX3NldDQsIG5hLnJtID0gVFJVRSkKI2F2ZXJhZ2VfSU4gPC0gbWVhbihJTl9zZXQ0LCBuYS5ybSA9IFRSVUUpCgojIFBsb3QgdGhlIEJpZCBhbmQgQXNrIHZhbHVlcyBvbiB0aGUgc2FtZSBwbG90CnBsb3QoTU1fcG9zX3NldDQsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAiYmxhY2siLCBtYWluID0gIlBvc2l0aW9uIGluIHNldCA0IiwgeGxhYiA9ICJJdGVyYXRpb24iLCB5bGFiID0gIlZhbHVlIiwgeWxpbSA9IGMobWluKGMoTU1fcG9zX3NldDQsIEluZm9ybWVkX3Bvc19zZXQ0LCBOb2lzeUluZm9ybWVkMV9wb3Nfc2V0NCwgTm9pc3lJbmZvcm1lZDJfcG9zX3NldDQsIE5vaXN5MV9wb3Nfc2V0NCwgTm9pc3kyX3Bvc19zZXQ0LCBTdG9jaE5vaXN5X3Bvc19zZXQ0KSksIG1heChjKE1NX3Bvc19zZXQ0LCBJbmZvcm1lZF9wb3Nfc2V0NCwgTm9pc3lJbmZvcm1lZDFfcG9zX3NldDQsIE5vaXN5SW5mb3JtZWQyX3Bvc19zZXQ0LCBOb2lzeTFfcG9zX3NldDQsIE5vaXN5Ml9wb3Nfc2V0NCwgU3RvY2hOb2lzeV9wb3Nfc2V0NCkpKSkKbGluZXMoSW5mb3JtZWRfcG9zX3NldDQsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAicmVkIikKbGluZXMoTm9pc3lJbmZvcm1lZDFfcG9zX3NldDQsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAiZ3JlZW4iKQpsaW5lcyhOb2lzeUluZm9ybWVkMl9wb3Nfc2V0NCwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJ5ZWxsb3ciKQpsaW5lcyhOb2lzeTFfcG9zX3NldDQsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAiYmx1ZSIpCmxpbmVzKE5vaXN5Ml9wb3Nfc2V0NCwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJwdXJwbGUiKQpsaW5lcyhTdG9jaE5vaXN5X3Bvc19zZXQ0LCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gIm9yYW5nZSIpCgoKIyBBZGQgbGVnZW5kCmxlZ2VuZCgidG9wbGVmdCIsIGxlZ2VuZCA9IGMoIk1hcmtldCBNYWtlciIsICJJbmZvcm1lZCIsICJOb2lzeSBJbmZvcm1lZCAxIiwgIk5vaXN5IEluZm9ybWVkIDIiLCAiTm9pc3kgMSIsICJOb2lzeSAyIiwgIlN0b2NoYXN0aWMgTm9pc3kiKSwgY29sID0gYygiYmxhY2siLCAicmVkIiwgImdyZWVuIiwgInllbGxvdyIsICJibHVlIiwgInB1cnBsZSIsICJvcmFuZ2UiKSwgbHR5ID0gMSwgY2V4ID0gMC44KQoKIyBBZGQgaG9yaXpvbnRhbCBsaW5lcyBmb3IgdGhlIGF2ZXJhZ2VzCiNhYmxpbmUoaCA9IGF2ZXJhZ2VfTU0sIGNvbCA9ICJibHVlIiwgbHR5ID0gMSkKI2FibGluZShoID0gYXZlcmFnZV9JTiwgY29sID0gInJlZCIsIGx0eSA9IDEpCmBgYAoKCmBgYHtyfQojIEluaXRpYWxpemUgbWF0cmljZXMgdG8gc3RvcmUgYXZlcmFnZXMgZm9yIGVhY2ggcG9zaXRpb24KYXZlcmFnZV9NTV9wb3MgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCmF2ZXJhZ2VfSW5mb3JtZWRfcG9zIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQphdmVyYWdlX05vaXN5SW5mb3JtZWQxX3BvcyA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9Ob2lzeUluZm9ybWVkMl9wb3MgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCmF2ZXJhZ2VfTm9pc3kxX3BvcyA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9Ob2lzeTJfcG9zIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQphdmVyYWdlX1N0b2NoTm9pc3lfcG9zIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQoKIyBMb29wIHRocm91Z2ggZWFjaCBzaW11bGF0aW9uIChuKQpmb3IgKG4gaW4gMToxMCkgewoKICBNTV9wb3Nfc2V0NCA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfNFtuLCA3XSkpLCAiLCAiKQoKICBJbmZvcm1lZF9wb3Nfc2V0NCA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfNFtuLCA5XSkpLCAiLCAiKQogIAogIE5vaXN5SW5mb3JtZWQxX3Bvc19zZXQ0IDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c180W24sIDExXSkpLCAiLCAiKQogIAogIE5vaXN5SW5mb3JtZWQyX3Bvc19zZXQ0IDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c180W24sIDEzXSkpLCAiLCAiKQogIAogIE5vaXN5MV9wb3Nfc2V0NCA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfNFtuLCAxNV0pKSwgIiwgIikKICAKICBOb2lzeTJfcG9zX3NldDQgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzRbbiwgMTddKSksICIsICIpCiAgCiAgU3RvY2hOb2lzeV9wb3Nfc2V0NCA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfNFtuLCAxOV0pKSwgIiwgIikKICAKICAjIExvb3AgdGhyb3VnaCBlYWNoIHBvc2l0aW9uIChpKQogIGZvciAoaSBpbiAxOjEwMCkgewogICAgIyBFeHRyYWN0IFRydWUgYW5kIEV4cGVjdGVkIHZhbHVlcyBmb3IgdGhlIGktdGggcG9zaXRpb24KICAgIE1NX3BvcyA8LSBzYXBwbHkoTU1fcG9zX3NldDQsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICBJbmZvcm1lZF9wb3MgPC0gc2FwcGx5KEluZm9ybWVkX3Bvc19zZXQ0LCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgTm9pc3lJbmZvcm1lZDFfcG9zIDwtIHNhcHBseShOb2lzeUluZm9ybWVkMV9wb3Nfc2V0NCwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIE5vaXN5SW5mb3JtZWQyX3BvcyA8LSBzYXBwbHkoTm9pc3lJbmZvcm1lZDJfcG9zX3NldDQsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICBOb2lzeTFfcG9zIDwtIHNhcHBseShOb2lzeTFfcG9zX3NldDQsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICBOb2lzeTJfcG9zIDwtIHNhcHBseShOb2lzeTJfcG9zX3NldDQsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICBTdG9jaE5vaXN5X3BvcyA8LSBzYXBwbHkoU3RvY2hOb2lzeV9wb3Nfc2V0NCwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIAogICAgIyBDYWxjdWxhdGUgdGhlIGF2ZXJhZ2Ugb2YgVHJ1ZSBhbmQgRXhwZWN0ZWQgdmFsdWVzIGZvciB0aGUgaS10aCBwb3NpdGlvbgogICAgYXZlcmFnZV9NTV9wb3NbaSwgbl0gPC0gbWVhbihNTV9wb3MsIG5hLnJtID0gVFJVRSkKICAgIGF2ZXJhZ2VfSW5mb3JtZWRfcG9zW2ksIG5dIDwtIG1lYW4oSW5mb3JtZWRfcG9zLCBuYS5ybSA9IFRSVUUpCiAgICBhdmVyYWdlX05vaXN5SW5mb3JtZWQxX3Bvc1tpLCBuXSA8LSBtZWFuKE5vaXN5SW5mb3JtZWQxX3BvcywgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9Ob2lzeUluZm9ybWVkMl9wb3NbaSwgbl0gPC0gbWVhbihOb2lzeUluZm9ybWVkMl9wb3MsIG5hLnJtID0gVFJVRSkKICAgIGF2ZXJhZ2VfTm9pc3kxX3Bvc1tpLCBuXSA8LSBtZWFuKE5vaXN5MV9wb3MsIG5hLnJtID0gVFJVRSkKICAgIGF2ZXJhZ2VfTm9pc3kyX3Bvc1tpLCBuXSA8LSBtZWFuKE5vaXN5Ml9wb3MsIG5hLnJtID0gVFJVRSkKICAgIGF2ZXJhZ2VfU3RvY2hOb2lzeV9wb3NbaSwgbl0gPC0gbWVhbihTdG9jaE5vaXN5X3BvcywgbmEucm0gPSBUUlVFKQogIH0KfQoKIyBDYWxjdWxhdGUgdGhlIG92ZXJhbGwgYXZlcmFnZSBmb3IgZWFjaCBwb3NpdGlvbiBhY3Jvc3MgYWxsIHNpbXVsYXRpb25zCm92ZXJhbGxfYXZlcmFnZV9NTV9wb3MgPC0gcm93TWVhbnMoYXZlcmFnZV9NTV9wb3MsIG5hLnJtID0gVFJVRSkKb3ZlcmFsbF9hdmVyYWdlX0luZm9ybWVkX3BvcyA8LSByb3dNZWFucyhhdmVyYWdlX0luZm9ybWVkX3BvcywgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfTm9pc3lJbmZvcm1lZDFfcG9zIDwtIHJvd01lYW5zKGF2ZXJhZ2VfTm9pc3lJbmZvcm1lZDFfcG9zLCBuYS5ybSA9IFRSVUUpCm92ZXJhbGxfYXZlcmFnZV9Ob2lzeUluZm9ybWVkMl9wb3MgPC0gcm93TWVhbnMoYXZlcmFnZV9Ob2lzeUluZm9ybWVkMl9wb3MsIG5hLnJtID0gVFJVRSkKb3ZlcmFsbF9hdmVyYWdlX05vaXN5MV9wb3MgPC0gcm93TWVhbnMoYXZlcmFnZV9Ob2lzeTFfcG9zLCBuYS5ybSA9IFRSVUUpCm92ZXJhbGxfYXZlcmFnZV9Ob2lzeTJfcG9zIDwtIHJvd01lYW5zKGF2ZXJhZ2VfTm9pc3kyX3BvcywgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfU3RvY2hOb2lzeV9wb3MgPC0gcm93TWVhbnMoYXZlcmFnZV9TdG9jaE5vaXN5X3BvcywgbmEucm0gPSBUUlVFKQoKIyBQbG90IHRoZSBvdmVyYWxsIGF2ZXJhZ2VzCnBsb3Qob3ZlcmFsbF9hdmVyYWdlX01NX3BvcywgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJibGFjayIsIG1haW4gPSAiT3ZlcmFsbCBBdmVyYWdlIFBvc2l0aW9uIiwgeGxhYiA9ICJQb3NpdGlvbiBpbiBMaXN0IiwgeWxhYiA9ICJWYWx1ZSIsIHlsaW0gPSBjKG1pbihjKG92ZXJhbGxfYXZlcmFnZV9NTV9wb3MsIG92ZXJhbGxfYXZlcmFnZV9JbmZvcm1lZF9wb3MsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeUluZm9ybWVkMV9wb3MsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeUluZm9ybWVkMl9wb3MsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeTFfcG9zLCBvdmVyYWxsX2F2ZXJhZ2VfTm9pc3kyX3Bvcywgb3ZlcmFsbF9hdmVyYWdlX1N0b2NoTm9pc3lfcG9zKSksIG1heChjKG92ZXJhbGxfYXZlcmFnZV9NTV9wb3MsIG92ZXJhbGxfYXZlcmFnZV9JbmZvcm1lZF9wb3MsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeUluZm9ybWVkMV9wb3MsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeUluZm9ybWVkMl9wb3MsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeTFfcG9zLCBvdmVyYWxsX2F2ZXJhZ2VfTm9pc3kyX3Bvcywgb3ZlcmFsbF9hdmVyYWdlX1N0b2NoTm9pc3lfcG9zKSkpKQpsaW5lcyhvdmVyYWxsX2F2ZXJhZ2VfSW5mb3JtZWRfcG9zLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gInJlZCIpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV9Ob2lzeUluZm9ybWVkMV9wb3MsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAiZ3JlZW4iKQpsaW5lcyhvdmVyYWxsX2F2ZXJhZ2VfTm9pc3lJbmZvcm1lZDJfcG9zLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gInllbGxvdyIpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV9Ob2lzeTFfcG9zLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gImJsdWUiKQpsaW5lcyhvdmVyYWxsX2F2ZXJhZ2VfTm9pc3kyX3BvcywgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJwdXJwbGUiKQpsaW5lcyhvdmVyYWxsX2F2ZXJhZ2VfU3RvY2hOb2lzeV9wb3MsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAib3JhbmdlIikKCiMgQWRkIGxlZ2VuZApsZWdlbmQoImJvdHRvbWxlZnQiLCBsZWdlbmQgPSBjKCJNYXJrZXQgTWFrZXIiLCAiSW5mb3JtZWQiLCAiTm9pc3kgSW5mb3JtZWQgMSIsICJOb2lzeSBJbmZvcm1lZCAyIiwgIk5vaXN5IDEiLCAiTm9pc3kgMiIsICJTdG9jaGFzdGljIE5vaXN5IiksIGNvbCA9IGMoImJsYWNrIiwgInJlZCIsICJncmVlbiIsICJ5ZWxsb3ciLCAiYmx1ZSIsICJwdXJwbGUiLCAib3JhbmdlIiksIGx0eSA9IDEsIGNleCA9IDAuOCkKYGBgCgoKCiMjIHNldCA1IChOb2lzeSo2KQoKYGBge3J9CiMgSW5pdGlhbGl6ZSBtYXRyaWNlcyB0byBzdG9yZSBhdmVyYWdlcyBmb3IgZWFjaCBwb3NpdGlvbgphdmVyYWdlX3RydWUgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCmF2ZXJhZ2VfZXhwZWN0ZWQgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCgojIExvb3AgdGhyb3VnaCBlYWNoIHNpbXVsYXRpb24gKG4pCmZvciAobiBpbiAxOjEwKSB7CiAgIyBFeHRyYWN0IFRydWUgdmFsdWVzIGZyb20gdGhlIGFnZ3JlZ2F0ZWRfcmVzdWx0c180IGRhdGFmcmFtZQogIFRydWVWYWx1ZXNfc2V0NSA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfNVtuLCAyXSkpLCAiLCAiKQogIAogICMgRXh0cmFjdCBFeHBlY3RlZCB2YWx1ZXMgZnJvbSB0aGUgYWdncmVnYXRlZF9yZXN1bHRzXzQgZGF0YWZyYW1lCiAgRXhwZWN0ZWRWYWx1ZXNfc2V0NSA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfNFtuLCAzXSkpLCAiLCAiKQogIAogICMgTG9vcCB0aHJvdWdoIGVhY2ggcG9zaXRpb24gKGkpCiAgZm9yIChpIGluIDE6MTAwKSB7CiAgICAjIEV4dHJhY3QgVHJ1ZSBhbmQgRXhwZWN0ZWQgdmFsdWVzIGZvciB0aGUgaS10aCBwb3NpdGlvbgogICAgVHJ1ZV92YWx1ZXMgPC0gc2FwcGx5KFRydWVWYWx1ZXNfc2V0NSwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIEV4cGVjdGVkX3ZhbHVlcyA8LSBzYXBwbHkoRXhwZWN0ZWRWYWx1ZXNfc2V0NSwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIAogICAgIyBDYWxjdWxhdGUgdGhlIGF2ZXJhZ2Ugb2YgVHJ1ZSBhbmQgRXhwZWN0ZWQgdmFsdWVzIGZvciB0aGUgaS10aCBwb3NpdGlvbgogICAgYXZlcmFnZV90cnVlW2ksIG5dIDwtIG1lYW4oVHJ1ZV92YWx1ZXMsIG5hLnJtID0gVFJVRSkKICAgIGF2ZXJhZ2VfZXhwZWN0ZWRbaSwgbl0gPC0gbWVhbihFeHBlY3RlZF92YWx1ZXMsIG5hLnJtID0gVFJVRSkKICB9Cn0KCiMgQ2FsY3VsYXRlIHRoZSBvdmVyYWxsIGF2ZXJhZ2UgZm9yIGVhY2ggcG9zaXRpb24gYWNyb3NzIGFsbCBzaW11bGF0aW9ucwpvdmVyYWxsX2F2ZXJhZ2VfdHJ1ZSA8LSByb3dNZWFucyhhdmVyYWdlX3RydWUsIG5hLnJtID0gVFJVRSkKb3ZlcmFsbF9hdmVyYWdlX2V4cGVjdGVkIDwtIHJvd01lYW5zKGF2ZXJhZ2VfZXhwZWN0ZWQsIG5hLnJtID0gVFJVRSkKCiMgUGxvdCB0aGUgb3ZlcmFsbCBhdmVyYWdlcwpwbG90KG92ZXJhbGxfYXZlcmFnZV90cnVlLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gImJsdWUiLCBtYWluID0gIk92ZXJhbGwgQXZlcmFnZSBvZiBUcnVlIHZzIEV4cGVjdGVkIFZhbHVlcyIsIHhsYWIgPSAiUG9zaXRpb24gaW4gTGlzdCIsIHlsYWIgPSAiVmFsdWUiLCB5bGltID0gYyhtaW4oYyhvdmVyYWxsX2F2ZXJhZ2VfdHJ1ZSwgb3ZlcmFsbF9hdmVyYWdlX2V4cGVjdGVkKSksIG1heChjKG92ZXJhbGxfYXZlcmFnZV90cnVlLCBvdmVyYWxsX2F2ZXJhZ2VfZXhwZWN0ZWQpKSkpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV9leHBlY3RlZCwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJyZWQiKQpsZWdlbmQoInRvcHJpZ2h0IiwgbGVnZW5kID0gYygiVHJ1ZSBWYWx1ZXMiLCAiRXhwZWN0ZWQgVmFsdWVzIiksIGNvbCA9IGMoImJsdWUiLCAicmVkIiksIGx0eSA9IDEsIGNleCA9IDAuOCkKYGBgCgoKYGBge3J9CiMgSW5pdGlhbGl6ZSBtYXRyaWNlcyB0byBzdG9yZSBhdmVyYWdlcyBmb3IgZWFjaCBwb3NpdGlvbgphdmVyYWdlX2JpZCA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9hc2sgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCgojIExvb3AgdGhyb3VnaCBlYWNoIHNpbXVsYXRpb24gKG4pCmZvciAobiBpbiAxOjEwKSB7CiAgIyBFeHRyYWN0IFRydWUgdmFsdWVzIGZyb20gdGhlIGFnZ3JlZ2F0ZWRfcmVzdWx0c180IGRhdGFmcmFtZQogIEJpZHNfc2V0NSA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfNVtuLCA0XSkpLCAiLCAiKQogIAogICMgRXh0cmFjdCBFeHBlY3RlZCB2YWx1ZXMgZnJvbSB0aGUgYWdncmVnYXRlZF9yZXN1bHRzXzQgZGF0YWZyYW1lCiAgQXNrc19zZXQ1IDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c181W24sIDVdKSksICIsICIpCiAgCiAgIyBMb29wIHRocm91Z2ggZWFjaCBwb3NpdGlvbiAoaSkKICBmb3IgKGkgaW4gMToxMDApIHsKICAgICMgRXh0cmFjdCBUcnVlIGFuZCBFeHBlY3RlZCB2YWx1ZXMgZm9yIHRoZSBpLXRoIHBvc2l0aW9uCiAgICBCaWRzIDwtIHNhcHBseShCaWRzX3NldDUsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICBBc2tzIDwtIHNhcHBseShBc2tzX3NldDUsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICAKICAgICMgQ2FsY3VsYXRlIHRoZSBhdmVyYWdlIG9mIFRydWUgYW5kIEV4cGVjdGVkIHZhbHVlcyBmb3IgdGhlIGktdGggcG9zaXRpb24KICAgIGF2ZXJhZ2VfYmlkW2ksIG5dIDwtIG1lYW4oQmlkcywgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9hc2tbaSwgbl0gPC0gbWVhbihBc2tzLCBuYS5ybSA9IFRSVUUpCiAgfQp9CgojIENhbGN1bGF0ZSB0aGUgb3ZlcmFsbCBhdmVyYWdlIGZvciBlYWNoIHBvc2l0aW9uIGFjcm9zcyBhbGwgc2ltdWxhdGlvbnMKb3ZlcmFsbF9hdmVyYWdlX2JpZCA8LSByb3dNZWFucyhhdmVyYWdlX2JpZCwgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfYXNrIDwtIHJvd01lYW5zKGF2ZXJhZ2VfYXNrLCBuYS5ybSA9IFRSVUUpCgojIFBsb3QgdGhlIG92ZXJhbGwgYXZlcmFnZXMKcGxvdChvdmVyYWxsX2F2ZXJhZ2VfYmlkLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gImJsdWUiLCBtYWluID0gIk92ZXJhbGwgQXZlcmFnZSBvZiBCaWRzIHZzIEFza3MiLCB4bGFiID0gIlBvc2l0aW9uIGluIExpc3QiLCB5bGFiID0gIlZhbHVlIiwgeWxpbSA9IGMobWluKGMob3ZlcmFsbF9hdmVyYWdlX2JpZCwgb3ZlcmFsbF9hdmVyYWdlX2FzaykpLCBtYXgoYyhvdmVyYWxsX2F2ZXJhZ2VfYmlkLCBvdmVyYWxsX2F2ZXJhZ2VfYXNrKSkpKQpsaW5lcyhvdmVyYWxsX2F2ZXJhZ2VfYXNrLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gInJlZCIpCmxlZ2VuZCgidG9wcmlnaHQiLCBsZWdlbmQgPSBjKCJCaWRzIiwgIkFza3MiKSwgY29sID0gYygiYmx1ZSIsICJyZWQiKSwgbHR5ID0gMSwgY2V4ID0gMC44KQpgYGAKCgoKYGBge3J9CiMgSW5pdGlhbGl6ZSBtYXRyaWNlcyB0byBzdG9yZSBhdmVyYWdlcyBmb3IgZWFjaCBwb3NpdGlvbgphdmVyYWdlX01NX3BubCA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9Ob2lzeTFfcG5sIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQphdmVyYWdlX05vaXN5Ml9wbmwgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCmF2ZXJhZ2VfTm9pc3kzX3BubCA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9Ob2lzeTRfcG5sIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQphdmVyYWdlX05vaXN5NV9wbmwgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCmF2ZXJhZ2VfTm9pc3k2X3BubCA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKCiMgTG9vcCB0aHJvdWdoIGVhY2ggc2ltdWxhdGlvbiAobikKZm9yIChuIGluIDE6MTApIHsKCiAgTU1fcG5sX3NldDUgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzVbbiwgNl0pKSwgIiwgIikKCiAgTm9pc3kxX3BubF9zZXQ1IDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c181W24sIDhdKSksICIsICIpCiAgCiAgTm9pc3kyX3BubF9zZXQ1IDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c181W24sIDEwXSkpLCAiLCAiKQogIAogIE5vaXN5M19wbmxfc2V0NSA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfNVtuLCAxMl0pKSwgIiwgIikKICAKICBOb2lzeTRfcG5sX3NldDUgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzVbbiwgMTRdKSksICIsICIpCiAgCiAgTm9pc3k1X3BubF9zZXQ1IDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c181W24sIDE2XSkpLCAiLCAiKQogIAogIE5vaXN5Nl9wbmxfc2V0NSA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfNVtuLCAxOF0pKSwgIiwgIikKICAKICAjIExvb3AgdGhyb3VnaCBlYWNoIHBvc2l0aW9uIChpKQogIGZvciAoaSBpbiAxOjEwMCkgewogICAgIyBFeHRyYWN0IFRydWUgYW5kIEV4cGVjdGVkIHZhbHVlcyBmb3IgdGhlIGktdGggcG9zaXRpb24KICAgIE1NX3BubCA8LSBzYXBwbHkoTU1fcG5sX3NldDUsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICBOb2lzeTFfcG5sIDwtIHNhcHBseShOb2lzeTFfcG5sX3NldDUsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICBOb2lzeTJfcG5sIDwtIHNhcHBseShOb2lzeTJfcG5sX3NldDUsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICBOb2lzeTNfcG5sIDwtIHNhcHBseShOb2lzeTNfcG5sX3NldDUsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICBOb2lzeTRfcG5sIDwtIHNhcHBseShOb2lzeTRfcG5sX3NldDUsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICBOb2lzeTVfcG5sIDwtIHNhcHBseShOb2lzeTVfcG5sX3NldDUsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICBOb2lzeTZfcG5sIDwtIHNhcHBseShOb2lzeTZfcG5sX3NldDUsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICAKICAgICMgQ2FsY3VsYXRlIHRoZSBhdmVyYWdlIG9mIFRydWUgYW5kIEV4cGVjdGVkIHZhbHVlcyBmb3IgdGhlIGktdGggcG9zaXRpb24KICAgIGF2ZXJhZ2VfTU1fcG5sW2ksIG5dIDwtIG1lYW4oTU1fcG5sLCBuYS5ybSA9IFRSVUUpCiAgICBhdmVyYWdlX05vaXN5MV9wbmxbaSwgbl0gPC0gbWVhbihOb2lzeTFfcG5sLCBuYS5ybSA9IFRSVUUpCiAgICBhdmVyYWdlX05vaXN5Ml9wbmxbaSwgbl0gPC0gbWVhbihOb2lzeTJfcG5sLCBuYS5ybSA9IFRSVUUpCiAgICBhdmVyYWdlX05vaXN5M19wbmxbaSwgbl0gPC0gbWVhbihOb2lzeTNfcG5sLCBuYS5ybSA9IFRSVUUpCiAgICBhdmVyYWdlX05vaXN5NF9wbmxbaSwgbl0gPC0gbWVhbihOb2lzeTRfcG5sLCBuYS5ybSA9IFRSVUUpCiAgICBhdmVyYWdlX05vaXN5NV9wbmxbaSwgbl0gPC0gbWVhbihOb2lzeTVfcG5sLCBuYS5ybSA9IFRSVUUpCiAgICBhdmVyYWdlX05vaXN5Nl9wbmxbaSwgbl0gPC0gbWVhbihOb2lzeTZfcG5sLCBuYS5ybSA9IFRSVUUpCiAgfQp9CgojIENhbGN1bGF0ZSB0aGUgb3ZlcmFsbCBhdmVyYWdlIGZvciBlYWNoIHBvc2l0aW9uIGFjcm9zcyBhbGwgc2ltdWxhdGlvbnMKb3ZlcmFsbF9hdmVyYWdlX01NX3BubCA8LSByb3dNZWFucyhhdmVyYWdlX01NX3BubCwgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfTm9pc3kxX3BubCA8LSByb3dNZWFucyhhdmVyYWdlX05vaXN5MV9wbmwsIG5hLnJtID0gVFJVRSkKb3ZlcmFsbF9hdmVyYWdlX05vaXN5Ml9wbmwgPC0gcm93TWVhbnMoYXZlcmFnZV9Ob2lzeTJfcG5sLCBuYS5ybSA9IFRSVUUpCm92ZXJhbGxfYXZlcmFnZV9Ob2lzeTNfcG5sIDwtIHJvd01lYW5zKGF2ZXJhZ2VfTm9pc3kzX3BubCwgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfTm9pc3k0X3BubCA8LSByb3dNZWFucyhhdmVyYWdlX05vaXN5NF9wbmwsIG5hLnJtID0gVFJVRSkKb3ZlcmFsbF9hdmVyYWdlX05vaXN5NV9wbmwgPC0gcm93TWVhbnMoYXZlcmFnZV9Ob2lzeTVfcG5sLCBuYS5ybSA9IFRSVUUpCm92ZXJhbGxfYXZlcmFnZV9Ob2lzeTZfcG5sIDwtIHJvd01lYW5zKGF2ZXJhZ2VfTm9pc3k2X3BubCwgbmEucm0gPSBUUlVFKQoKIyBQbG90IHRoZSBvdmVyYWxsIGF2ZXJhZ2VzCnBsb3Qob3ZlcmFsbF9hdmVyYWdlX01NX3BubCwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJibGFjayIsIG1haW4gPSAiT3ZlcmFsbCBBdmVyYWdlIFBOTCIsIHhsYWIgPSAiUG9zaXRpb24gaW4gTGlzdCIsIHlsYWIgPSAiVmFsdWUiLCB5bGltID0gYyhtaW4oYyhvdmVyYWxsX2F2ZXJhZ2VfTU1fcG5sLCBvdmVyYWxsX2F2ZXJhZ2VfTm9pc3kxX3BubCwgb3ZlcmFsbF9hdmVyYWdlX05vaXN5Ml9wbmwsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeTNfcG5sLCBvdmVyYWxsX2F2ZXJhZ2VfTm9pc3k0X3BubCwgb3ZlcmFsbF9hdmVyYWdlX05vaXN5NV9wbmwsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeTZfcG5sKSksIG1heChjKG92ZXJhbGxfYXZlcmFnZV9NTV9wbmwsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeTFfcG5sLCBvdmVyYWxsX2F2ZXJhZ2VfTm9pc3kyX3BubCwgb3ZlcmFsbF9hdmVyYWdlX05vaXN5M19wbmwsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeTRfcG5sLCBvdmVyYWxsX2F2ZXJhZ2VfTm9pc3k1X3BubCwgb3ZlcmFsbF9hdmVyYWdlX05vaXN5Nl9wbmwpKSkpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV9Ob2lzeTFfcG5sLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gInJlZCIpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV9Ob2lzeTJfcG5sLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gImdyZWVuIikKbGluZXMob3ZlcmFsbF9hdmVyYWdlX05vaXN5M19wbmwsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAieWVsbG93IikKbGluZXMob3ZlcmFsbF9hdmVyYWdlX05vaXN5NF9wbmwsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAiYmx1ZSIpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV9Ob2lzeTVfcG5sLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gInB1cnBsZSIpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV9Ob2lzeTZfcG5sLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gIm9yYW5nZSIpCgojIEFkZCBsZWdlbmQKbGVnZW5kKCJib3R0b21sZWZ0IiwgbGVnZW5kID0gYygiTWFya2V0IE1ha2VyIiwgIk5vaXN5IDEiLCAiTm9pc3kgMiIsICJOb2lzeSAzIiwgIk5vaXN5IDQiLCAiTm9pc3kgNSIsICJOb2lzeSA2IiksIGNvbCA9IGMoImJsYWNrIiwgInJlZCIsICJncmVlbiIsICJ5ZWxsb3ciLCAiYmx1ZSIsICJwdXJwbGUiLCAib3JhbmdlIiksIGx0eSA9IDEsIGNleCA9IDAuOCkKYGBgCgoKYGBge3J9CiMgSW5pdGlhbGl6ZSBtYXRyaWNlcyB0byBzdG9yZSBhdmVyYWdlcyBmb3IgZWFjaCBwb3NpdGlvbgphdmVyYWdlX01NX3BvcyA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9Ob2lzeTFfcG9zIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQphdmVyYWdlX05vaXN5Ml9wb3MgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCmF2ZXJhZ2VfTm9pc3kzX3BvcyA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9Ob2lzeTRfcG9zIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQphdmVyYWdlX05vaXN5NV9wb3MgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCmF2ZXJhZ2VfTm9pc3k2X3BvcyA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKCiMgTG9vcCB0aHJvdWdoIGVhY2ggc2ltdWxhdGlvbiAobikKZm9yIChuIGluIDE6MTApIHsKCiAgTU1fcG9zX3NldDUgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzVbbiwgN10pKSwgIiwgIikKCiAgTm9pc3kxX3Bvc19zZXQ1IDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c181W24sIDldKSksICIsICIpCiAgCiAgTm9pc3kyX3Bvc19zZXQ1IDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c181W24sIDExXSkpLCAiLCAiKQogIAogIE5vaXN5M19wb3Nfc2V0NSA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfNVtuLCAxM10pKSwgIiwgIikKICAKICBOb2lzeTRfcG9zX3NldDUgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzVbbiwgMTVdKSksICIsICIpCiAgCiAgTm9pc3k1X3Bvc19zZXQ1IDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c181W24sIDE3XSkpLCAiLCAiKQogIAogIE5vaXN5Nl9wb3Nfc2V0NSA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfNVtuLCAxOV0pKSwgIiwgIikKICAKICAjIExvb3AgdGhyb3VnaCBlYWNoIHBvc2l0aW9uIChpKQogIGZvciAoaSBpbiAxOjEwMCkgewogICAgIyBFeHRyYWN0IFRydWUgYW5kIEV4cGVjdGVkIHZhbHVlcyBmb3IgdGhlIGktdGggcG9zaXRpb24KICAgIE1NX3BvcyA8LSBzYXBwbHkoTU1fcG9zX3NldDUsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICBOb2lzeTFfcG9zIDwtIHNhcHBseShOb2lzeTFfcG9zX3NldDUsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICBOb2lzeTJfcG9zIDwtIHNhcHBseShOb2lzeTJfcG9zX3NldDUsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICBOb2lzeTNfcG9zIDwtIHNhcHBseShOb2lzeTNfcG9zX3NldDUsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICBOb2lzeTRfcG9zIDwtIHNhcHBseShOb2lzeTRfcG9zX3NldDUsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICBOb2lzeTVfcG9zIDwtIHNhcHBseShOb2lzeTVfcG9zX3NldDUsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICBOb2lzeTZfcG9zIDwtIHNhcHBseShOb2lzeTZfcG9zX3NldDUsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICAKICAgICMgQ2FsY3VsYXRlIHRoZSBhdmVyYWdlIG9mIFRydWUgYW5kIEV4cGVjdGVkIHZhbHVlcyBmb3IgdGhlIGktdGggcG9zaXRpb24KICAgIGF2ZXJhZ2VfTU1fcG9zW2ksIG5dIDwtIG1lYW4oTU1fcG9zLCBuYS5ybSA9IFRSVUUpCiAgICBhdmVyYWdlX05vaXN5MV9wb3NbaSwgbl0gPC0gbWVhbihOb2lzeTFfcG9zLCBuYS5ybSA9IFRSVUUpCiAgICBhdmVyYWdlX05vaXN5Ml9wb3NbaSwgbl0gPC0gbWVhbihOb2lzeTJfcG9zLCBuYS5ybSA9IFRSVUUpCiAgICBhdmVyYWdlX05vaXN5M19wb3NbaSwgbl0gPC0gbWVhbihOb2lzeTNfcG9zLCBuYS5ybSA9IFRSVUUpCiAgICBhdmVyYWdlX05vaXN5NF9wb3NbaSwgbl0gPC0gbWVhbihOb2lzeTRfcG9zLCBuYS5ybSA9IFRSVUUpCiAgICBhdmVyYWdlX05vaXN5NV9wb3NbaSwgbl0gPC0gbWVhbihOb2lzeTVfcG9zLCBuYS5ybSA9IFRSVUUpCiAgICBhdmVyYWdlX05vaXN5Nl9wb3NbaSwgbl0gPC0gbWVhbihOb2lzeTZfcG9zLCBuYS5ybSA9IFRSVUUpCiAgfQp9CgojIENhbGN1bGF0ZSB0aGUgb3ZlcmFsbCBhdmVyYWdlIGZvciBlYWNoIHBvc2l0aW9uIGFjcm9zcyBhbGwgc2ltdWxhdGlvbnMKb3ZlcmFsbF9hdmVyYWdlX01NX3BvcyA8LSByb3dNZWFucyhhdmVyYWdlX01NX3BvcywgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfTm9pc3kxX3BvcyA8LSByb3dNZWFucyhhdmVyYWdlX05vaXN5MV9wb3MsIG5hLnJtID0gVFJVRSkKb3ZlcmFsbF9hdmVyYWdlX05vaXN5Ml9wb3MgPC0gcm93TWVhbnMoYXZlcmFnZV9Ob2lzeTJfcG9zLCBuYS5ybSA9IFRSVUUpCm92ZXJhbGxfYXZlcmFnZV9Ob2lzeTNfcG9zIDwtIHJvd01lYW5zKGF2ZXJhZ2VfTm9pc3kzX3BvcywgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfTm9pc3k0X3BvcyA8LSByb3dNZWFucyhhdmVyYWdlX05vaXN5NF9wb3MsIG5hLnJtID0gVFJVRSkKb3ZlcmFsbF9hdmVyYWdlX05vaXN5NV9wb3MgPC0gcm93TWVhbnMoYXZlcmFnZV9Ob2lzeTVfcG9zLCBuYS5ybSA9IFRSVUUpCm92ZXJhbGxfYXZlcmFnZV9Ob2lzeTZfcG9zIDwtIHJvd01lYW5zKGF2ZXJhZ2VfTm9pc3k2X3BvcywgbmEucm0gPSBUUlVFKQoKIyBQbG90IHRoZSBvdmVyYWxsIGF2ZXJhZ2VzCnBsb3Qob3ZlcmFsbF9hdmVyYWdlX01NX3BvcywgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJibGFjayIsIG1haW4gPSAiT3ZlcmFsbCBBdmVyYWdlIFBvc2l0aW9uIiwgeGxhYiA9ICJQb3NpdGlvbiBpbiBMaXN0IiwgeWxhYiA9ICJWYWx1ZSIsIHlsaW0gPSBjKG1pbihjKG92ZXJhbGxfYXZlcmFnZV9NTV9wb3MsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeTFfcG9zLCBvdmVyYWxsX2F2ZXJhZ2VfTm9pc3kyX3Bvcywgb3ZlcmFsbF9hdmVyYWdlX05vaXN5M19wb3MsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeTRfcG9zLCBvdmVyYWxsX2F2ZXJhZ2VfTm9pc3k1X3Bvcywgb3ZlcmFsbF9hdmVyYWdlX05vaXN5Nl9wb3MpKSwgbWF4KGMob3ZlcmFsbF9hdmVyYWdlX01NX3Bvcywgb3ZlcmFsbF9hdmVyYWdlX05vaXN5MV9wb3MsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeTJfcG9zLCBvdmVyYWxsX2F2ZXJhZ2VfTm9pc3kzX3Bvcywgb3ZlcmFsbF9hdmVyYWdlX05vaXN5NF9wb3MsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeTVfcG9zLCBvdmVyYWxsX2F2ZXJhZ2VfTm9pc3k2X3BvcykpKSkKbGluZXMob3ZlcmFsbF9hdmVyYWdlX05vaXN5MV9wb3MsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAicmVkIikKbGluZXMob3ZlcmFsbF9hdmVyYWdlX05vaXN5Ml9wb3MsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAiZ3JlZW4iKQpsaW5lcyhvdmVyYWxsX2F2ZXJhZ2VfTm9pc3kzX3BvcywgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJ5ZWxsb3ciKQpsaW5lcyhvdmVyYWxsX2F2ZXJhZ2VfTm9pc3k0X3BvcywgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJibHVlIikKbGluZXMob3ZlcmFsbF9hdmVyYWdlX05vaXN5NV9wb3MsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAicHVycGxlIikKbGluZXMob3ZlcmFsbF9hdmVyYWdlX05vaXN5Nl9wb3MsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAib3JhbmdlIikKCiMgQWRkIGxlZ2VuZApsZWdlbmQoImJvdHRvbXJpZ2h0IiwgbGVnZW5kID0gYygiTWFya2V0IE1ha2VyIiwgIk5vaXN5IDEiLCAiTm9pc3kgMiIsICJOb2lzeSAzIiwgIk5vaXN5IDQiLCAiTm9pc3kgNSIsICJOb2lzeSA2IiksIGNvbCA9IGMoImJsYWNrIiwgInJlZCIsICJncmVlbiIsICJ5ZWxsb3ciLCAiYmx1ZSIsICJwdXJwbGUiLCAib3JhbmdlIiksIGx0eSA9IDEsIGNleCA9IDAuOCkKYGBgCgoKIyMgc2V0NiAoMSBpbmZvcm1lZCArIDUgbm9pc3kpCgpgYGB7cn0KIyBJbml0aWFsaXplIG1hdHJpY2VzIHRvIHN0b3JlIGF2ZXJhZ2VzIGZvciBlYWNoIHBvc2l0aW9uCmF2ZXJhZ2VfdHJ1ZSA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9leHBlY3RlZCA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKCiMgTG9vcCB0aHJvdWdoIGVhY2ggc2ltdWxhdGlvbiAobikKZm9yIChuIGluIDE6MTApIHsKICAjIEV4dHJhY3QgVHJ1ZSB2YWx1ZXMgZnJvbSB0aGUgYWdncmVnYXRlZF9yZXN1bHRzXzQgZGF0YWZyYW1lCiAgVHJ1ZVZhbHVlc19zZXQ2IDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c182W24sIDJdKSksICIsICIpCiAgCiAgIyBFeHRyYWN0IEV4cGVjdGVkIHZhbHVlcyBmcm9tIHRoZSBhZ2dyZWdhdGVkX3Jlc3VsdHNfNCBkYXRhZnJhbWUKICBFeHBlY3RlZFZhbHVlc19zZXQ2IDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c182W24sIDNdKSksICIsICIpCiAgCiAgIyBMb29wIHRocm91Z2ggZWFjaCBwb3NpdGlvbiAoaSkKICBmb3IgKGkgaW4gMToxMDApIHsKICAgICMgRXh0cmFjdCBUcnVlIGFuZCBFeHBlY3RlZCB2YWx1ZXMgZm9yIHRoZSBpLXRoIHBvc2l0aW9uCiAgICBUcnVlX3ZhbHVlcyA8LSBzYXBwbHkoVHJ1ZVZhbHVlc19zZXQ2LCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgRXhwZWN0ZWRfdmFsdWVzIDwtIHNhcHBseShFeHBlY3RlZFZhbHVlc19zZXQ2LCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgCiAgICAjIENhbGN1bGF0ZSB0aGUgYXZlcmFnZSBvZiBUcnVlIGFuZCBFeHBlY3RlZCB2YWx1ZXMgZm9yIHRoZSBpLXRoIHBvc2l0aW9uCiAgICBhdmVyYWdlX3RydWVbaSwgbl0gPC0gbWVhbihUcnVlX3ZhbHVlcywgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9leHBlY3RlZFtpLCBuXSA8LSBtZWFuKEV4cGVjdGVkX3ZhbHVlcywgbmEucm0gPSBUUlVFKQogIH0KfQoKIyBDYWxjdWxhdGUgdGhlIG92ZXJhbGwgYXZlcmFnZSBmb3IgZWFjaCBwb3NpdGlvbiBhY3Jvc3MgYWxsIHNpbXVsYXRpb25zCm92ZXJhbGxfYXZlcmFnZV90cnVlIDwtIHJvd01lYW5zKGF2ZXJhZ2VfdHJ1ZSwgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfZXhwZWN0ZWQgPC0gcm93TWVhbnMoYXZlcmFnZV9leHBlY3RlZCwgbmEucm0gPSBUUlVFKQoKIyBQbG90IHRoZSBvdmVyYWxsIGF2ZXJhZ2VzCnBsb3Qob3ZlcmFsbF9hdmVyYWdlX3RydWUsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAiYmx1ZSIsIG1haW4gPSAiT3ZlcmFsbCBBdmVyYWdlIG9mIFRydWUgdnMgRXhwZWN0ZWQgVmFsdWVzIiwgeGxhYiA9ICJQb3NpdGlvbiBpbiBMaXN0IiwgeWxhYiA9ICJWYWx1ZSIsIHlsaW0gPSBjKG1pbihjKG92ZXJhbGxfYXZlcmFnZV90cnVlLCBvdmVyYWxsX2F2ZXJhZ2VfZXhwZWN0ZWQpKSwgbWF4KGMob3ZlcmFsbF9hdmVyYWdlX3RydWUsIG92ZXJhbGxfYXZlcmFnZV9leHBlY3RlZCkpKSkKbGluZXMob3ZlcmFsbF9hdmVyYWdlX2V4cGVjdGVkLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gInJlZCIpCmxlZ2VuZCgidG9wcmlnaHQiLCBsZWdlbmQgPSBjKCJUcnVlIFZhbHVlcyIsICJFeHBlY3RlZCBWYWx1ZXMiKSwgY29sID0gYygiYmx1ZSIsICJyZWQiKSwgbHR5ID0gMSwgY2V4ID0gMC44KQpgYGAKCgoKYGBge3J9CiMgSW5pdGlhbGl6ZSBtYXRyaWNlcyB0byBzdG9yZSBhdmVyYWdlcyBmb3IgZWFjaCBwb3NpdGlvbgphdmVyYWdlX2JpZCA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9hc2sgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCgojIExvb3AgdGhyb3VnaCBlYWNoIHNpbXVsYXRpb24gKG4pCmZvciAobiBpbiAxOjEwKSB7CiAgIyBFeHRyYWN0IFRydWUgdmFsdWVzIGZyb20gdGhlIGFnZ3JlZ2F0ZWRfcmVzdWx0c180IGRhdGFmcmFtZQogIEJpZHNfc2V0NiA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfNltuLCA0XSkpLCAiLCAiKQogIAogICMgRXh0cmFjdCBFeHBlY3RlZCB2YWx1ZXMgZnJvbSB0aGUgYWdncmVnYXRlZF9yZXN1bHRzXzQgZGF0YWZyYW1lCiAgQXNrc19zZXQ2IDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c182W24sIDVdKSksICIsICIpCiAgCiAgIyBMb29wIHRocm91Z2ggZWFjaCBwb3NpdGlvbiAoaSkKICBmb3IgKGkgaW4gMToxMDApIHsKICAgICMgRXh0cmFjdCBUcnVlIGFuZCBFeHBlY3RlZCB2YWx1ZXMgZm9yIHRoZSBpLXRoIHBvc2l0aW9uCiAgICBCaWRzIDwtIHNhcHBseShCaWRzX3NldDYsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICBBc2tzIDwtIHNhcHBseShBc2tzX3NldDYsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICAKICAgICMgQ2FsY3VsYXRlIHRoZSBhdmVyYWdlIG9mIFRydWUgYW5kIEV4cGVjdGVkIHZhbHVlcyBmb3IgdGhlIGktdGggcG9zaXRpb24KICAgIGF2ZXJhZ2VfYmlkW2ksIG5dIDwtIG1lYW4oQmlkcywgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9hc2tbaSwgbl0gPC0gbWVhbihBc2tzLCBuYS5ybSA9IFRSVUUpCiAgfQp9CgojIENhbGN1bGF0ZSB0aGUgb3ZlcmFsbCBhdmVyYWdlIGZvciBlYWNoIHBvc2l0aW9uIGFjcm9zcyBhbGwgc2ltdWxhdGlvbnMKb3ZlcmFsbF9hdmVyYWdlX2JpZCA8LSByb3dNZWFucyhhdmVyYWdlX2JpZCwgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfYXNrIDwtIHJvd01lYW5zKGF2ZXJhZ2VfYXNrLCBuYS5ybSA9IFRSVUUpCgojIFBsb3QgdGhlIG92ZXJhbGwgYXZlcmFnZXMKcGxvdChvdmVyYWxsX2F2ZXJhZ2VfYmlkLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gImJsdWUiLCBtYWluID0gIk92ZXJhbGwgQXZlcmFnZSBvZiBCaWRzIHZzIEFza3MiLCB4bGFiID0gIlBvc2l0aW9uIGluIExpc3QiLCB5bGFiID0gIlZhbHVlIiwgeWxpbSA9IGMobWluKGMob3ZlcmFsbF9hdmVyYWdlX2JpZCwgb3ZlcmFsbF9hdmVyYWdlX2FzaykpLCBtYXgoYyhvdmVyYWxsX2F2ZXJhZ2VfYmlkLCBvdmVyYWxsX2F2ZXJhZ2VfYXNrKSkpKQpsaW5lcyhvdmVyYWxsX2F2ZXJhZ2VfYXNrLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gInJlZCIpCmxlZ2VuZCgidG9wcmlnaHQiLCBsZWdlbmQgPSBjKCJCaWRzIiwgIkFza3MiKSwgY29sID0gYygiYmx1ZSIsICJyZWQiKSwgbHR5ID0gMSwgY2V4ID0gMC44KQpgYGAKCgpgYGB7cn0KIyBJbml0aWFsaXplIG1hdHJpY2VzIHRvIHN0b3JlIGF2ZXJhZ2VzIGZvciBlYWNoIHBvc2l0aW9uCmF2ZXJhZ2VfTU1fcG5sIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQphdmVyYWdlX0luZm9ybWVkX3BubCA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9Ob2lzeTFfcG5sIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQphdmVyYWdlX05vaXN5Ml9wbmwgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCmF2ZXJhZ2VfTm9pc3kzX3BubCA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9Ob2lzeTRfcG5sIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQphdmVyYWdlX05vaXN5NV9wbmwgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCgojIExvb3AgdGhyb3VnaCBlYWNoIHNpbXVsYXRpb24gKG4pCmZvciAobiBpbiAxOjEwKSB7CgogIE1NX3BubF9zZXQ2IDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c182W24sIDZdKSksICIsICIpCgogIEluZm9ybWVkX3BubF9zZXQ2IDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c182W24sIDhdKSksICIsICIpCiAgCiAgTm9pc3kxX3BubF9zZXQ2IDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c182W24sIDEwXSkpLCAiLCAiKQogIAogIE5vaXN5Ml9wbmxfc2V0NiA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfNltuLCAxMl0pKSwgIiwgIikKICAKICBOb2lzeTNfcG5sX3NldDYgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzZbbiwgMTRdKSksICIsICIpCiAgCiAgTm9pc3k0X3BubF9zZXQ2IDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c182W24sIDE2XSkpLCAiLCAiKQogIAogIE5vaXN5NV9wbmxfc2V0NiA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfNltuLCAxOF0pKSwgIiwgIikKICAKICAjIExvb3AgdGhyb3VnaCBlYWNoIHBvc2l0aW9uIChpKQogIGZvciAoaSBpbiAxOjEwMCkgewogICAgIyBFeHRyYWN0IFRydWUgYW5kIEV4cGVjdGVkIHZhbHVlcyBmb3IgdGhlIGktdGggcG9zaXRpb24KICAgIE1NX3BubCA8LSBzYXBwbHkoTU1fcG5sX3NldDYsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICBJbmZvcm1lZF9wbmwgPC0gc2FwcGx5KEluZm9ybWVkX3BubF9zZXQ2LCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgTm9pc3kxX3BubCA8LSBzYXBwbHkoTm9pc3kxX3BubF9zZXQ2LCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgTm9pc3kyX3BubCA8LSBzYXBwbHkoTm9pc3kyX3BubF9zZXQ2LCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgTm9pc3kzX3BubCA8LSBzYXBwbHkoTm9pc3kzX3BubF9zZXQ2LCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgTm9pc3k0X3BubCA8LSBzYXBwbHkoTm9pc3k0X3BubF9zZXQ2LCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgTm9pc3k1X3BubCA8LSBzYXBwbHkoTm9pc3k1X3BubF9zZXQ2LCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgCiAgICAjIENhbGN1bGF0ZSB0aGUgYXZlcmFnZSBvZiBUcnVlIGFuZCBFeHBlY3RlZCB2YWx1ZXMgZm9yIHRoZSBpLXRoIHBvc2l0aW9uCiAgICBhdmVyYWdlX01NX3BubFtpLCBuXSA8LSBtZWFuKE1NX3BubCwgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9JbmZvcm1lZF9wbmxbaSwgbl0gPC0gbWVhbihJbmZvcm1lZF9wbmwsIG5hLnJtID0gVFJVRSkKICAgIGF2ZXJhZ2VfTm9pc3kxX3BubFtpLCBuXSA8LSBtZWFuKE5vaXN5MV9wbmwsIG5hLnJtID0gVFJVRSkKICAgIGF2ZXJhZ2VfTm9pc3kyX3BubFtpLCBuXSA8LSBtZWFuKE5vaXN5Ml9wbmwsIG5hLnJtID0gVFJVRSkKICAgIGF2ZXJhZ2VfTm9pc3kzX3BubFtpLCBuXSA8LSBtZWFuKE5vaXN5M19wbmwsIG5hLnJtID0gVFJVRSkKICAgIGF2ZXJhZ2VfTm9pc3k0X3BubFtpLCBuXSA8LSBtZWFuKE5vaXN5NF9wbmwsIG5hLnJtID0gVFJVRSkKICAgIGF2ZXJhZ2VfTm9pc3k1X3BubFtpLCBuXSA8LSBtZWFuKE5vaXN5NV9wbmwsIG5hLnJtID0gVFJVRSkKICB9Cn0KCiMgQ2FsY3VsYXRlIHRoZSBvdmVyYWxsIGF2ZXJhZ2UgZm9yIGVhY2ggcG9zaXRpb24gYWNyb3NzIGFsbCBzaW11bGF0aW9ucwpvdmVyYWxsX2F2ZXJhZ2VfTU1fcG5sIDwtIHJvd01lYW5zKGF2ZXJhZ2VfTU1fcG5sLCBuYS5ybSA9IFRSVUUpCm92ZXJhbGxfYXZlcmFnZV9JbmZvcm1lZF9wbmwgPC0gcm93TWVhbnMoYXZlcmFnZV9JbmZvcm1lZF9wbmwsIG5hLnJtID0gVFJVRSkKb3ZlcmFsbF9hdmVyYWdlX05vaXN5MV9wbmwgPC0gcm93TWVhbnMoYXZlcmFnZV9Ob2lzeTFfcG5sLCBuYS5ybSA9IFRSVUUpCm92ZXJhbGxfYXZlcmFnZV9Ob2lzeTJfcG5sIDwtIHJvd01lYW5zKGF2ZXJhZ2VfTm9pc3kyX3BubCwgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfTm9pc3kzX3BubCA8LSByb3dNZWFucyhhdmVyYWdlX05vaXN5M19wbmwsIG5hLnJtID0gVFJVRSkKb3ZlcmFsbF9hdmVyYWdlX05vaXN5NF9wbmwgPC0gcm93TWVhbnMoYXZlcmFnZV9Ob2lzeTRfcG5sLCBuYS5ybSA9IFRSVUUpCm92ZXJhbGxfYXZlcmFnZV9Ob2lzeTVfcG5sIDwtIHJvd01lYW5zKGF2ZXJhZ2VfTm9pc3k1X3BubCwgbmEucm0gPSBUUlVFKQoKIyBQbG90IHRoZSBvdmVyYWxsIGF2ZXJhZ2VzCnBsb3Qob3ZlcmFsbF9hdmVyYWdlX01NX3BubCwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJibGFjayIsIG1haW4gPSAiT3ZlcmFsbCBBdmVyYWdlIFBOTCIsIHhsYWIgPSAiUG9zaXRpb24gaW4gTGlzdCIsIHlsYWIgPSAiVmFsdWUiLCB5bGltID0gYyhtaW4oYyhvdmVyYWxsX2F2ZXJhZ2VfTU1fcG5sLCBvdmVyYWxsX2F2ZXJhZ2VfSW5mb3JtZWRfcG5sLCBvdmVyYWxsX2F2ZXJhZ2VfTm9pc3kxX3BubCwgb3ZlcmFsbF9hdmVyYWdlX05vaXN5Ml9wbmwsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeTNfcG5sLCBvdmVyYWxsX2F2ZXJhZ2VfTm9pc3k0X3BubCwgb3ZlcmFsbF9hdmVyYWdlX05vaXN5NV9wbmwpKSwgbWF4KGMob3ZlcmFsbF9hdmVyYWdlX01NX3BubCwgb3ZlcmFsbF9hdmVyYWdlX0luZm9ybWVkX3BubCwgb3ZlcmFsbF9hdmVyYWdlX05vaXN5MV9wbmwsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeTJfcG5sLCBvdmVyYWxsX2F2ZXJhZ2VfTm9pc3kzX3BubCwgb3ZlcmFsbF9hdmVyYWdlX05vaXN5NF9wbmwsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeTVfcG5sKSkpKQpsaW5lcyhvdmVyYWxsX2F2ZXJhZ2VfSW5mb3JtZWRfcG5sLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gInJlZCIpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV9Ob2lzeTFfcG5sLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gImdyZWVuIikKbGluZXMob3ZlcmFsbF9hdmVyYWdlX05vaXN5Ml9wbmwsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAieWVsbG93IikKbGluZXMob3ZlcmFsbF9hdmVyYWdlX05vaXN5M19wbmwsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAiYmx1ZSIpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV9Ob2lzeTRfcG5sLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gInB1cnBsZSIpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV9Ob2lzeTVfcG5sLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gIm9yYW5nZSIpCgojIEFkZCBsZWdlbmQKbGVnZW5kKCJib3R0b21sZWZ0IiwgbGVnZW5kID0gYygiTWFya2V0IE1ha2VyIiwgIkluZm9ybWVkIiwgIk5vaXN5IDEiLCAiTm9pc3kgMiIsICJOb2lzeSAzIiwgIk5vaXN5IDQiLCAiTm9pc3kgNSIpLCBjb2wgPSBjKCJibGFjayIsICJyZWQiLCAiZ3JlZW4iLCAieWVsbG93IiwgImJsdWUiLCAicHVycGxlIiwgIm9yYW5nZSIpLCBsdHkgPSAxLCBjZXggPSAwLjgpCmBgYAoKCmBgYHtyfQojIEluaXRpYWxpemUgbWF0cmljZXMgdG8gc3RvcmUgYXZlcmFnZXMgZm9yIGVhY2ggcG9zaXRpb24KYXZlcmFnZV9NTV9wb3MgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCmF2ZXJhZ2VfSW5mb3JtZWRfcG9zIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQphdmVyYWdlX05vaXN5MV9wb3MgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCmF2ZXJhZ2VfTm9pc3kyX3BvcyA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9Ob2lzeTNfcG9zIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQphdmVyYWdlX05vaXN5NF9wb3MgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCmF2ZXJhZ2VfTm9pc3k1X3BvcyA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKCiMgTG9vcCB0aHJvdWdoIGVhY2ggc2ltdWxhdGlvbiAobikKZm9yIChuIGluIDE6MTApIHsKCiAgTU1fcG9zX3NldDYgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzZbbiwgN10pKSwgIiwgIikKCiAgSW5mb3JtZWRfcG9zX3NldDYgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzZbbiwgOV0pKSwgIiwgIikKICAKICBOb2lzeTFfcG9zX3NldDYgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzZbbiwgMTFdKSksICIsICIpCiAgCiAgTm9pc3kyX3Bvc19zZXQ2IDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c182W24sIDEzXSkpLCAiLCAiKQogIAogIE5vaXN5M19wb3Nfc2V0NiA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfNltuLCAxNV0pKSwgIiwgIikKICAKICBOb2lzeTRfcG9zX3NldDYgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzZbbiwgMTddKSksICIsICIpCiAgCiAgTm9pc3k1X3Bvc19zZXQ2IDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c182W24sIDE5XSkpLCAiLCAiKQogIAogICMgTG9vcCB0aHJvdWdoIGVhY2ggcG9zaXRpb24gKGkpCiAgZm9yIChpIGluIDE6MTAwKSB7CiAgICAjIEV4dHJhY3QgVHJ1ZSBhbmQgRXhwZWN0ZWQgdmFsdWVzIGZvciB0aGUgaS10aCBwb3NpdGlvbgogICAgTU1fcG9zIDwtIHNhcHBseShNTV9wb3Nfc2V0NiwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIEluZm9ybWVkX3BvcyA8LSBzYXBwbHkoSW5mb3JtZWRfcG5sX3NldDYsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICBOb2lzeTFfcG9zIDwtIHNhcHBseShOb2lzeTFfcG9zX3NldDYsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICBOb2lzeTJfcG9zIDwtIHNhcHBseShOb2lzeTJfcG9zX3NldDYsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICBOb2lzeTNfcG9zIDwtIHNhcHBseShOb2lzeTNfcG9zX3NldDYsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICBOb2lzeTRfcG9zIDwtIHNhcHBseShOb2lzeTRfcG9zX3NldDYsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICBOb2lzeTVfcG9zIDwtIHNhcHBseShOb2lzeTVfcG9zX3NldDYsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICAKICAgICMgQ2FsY3VsYXRlIHRoZSBhdmVyYWdlIG9mIFRydWUgYW5kIEV4cGVjdGVkIHZhbHVlcyBmb3IgdGhlIGktdGggcG9zaXRpb24KICAgIGF2ZXJhZ2VfTU1fcG9zW2ksIG5dIDwtIG1lYW4oTU1fcG9zLCBuYS5ybSA9IFRSVUUpCiAgICBhdmVyYWdlX0luZm9ybWVkX3Bvc1tpLCBuXSA8LSBtZWFuKEluZm9ybWVkX3BvcywgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9Ob2lzeTFfcG9zW2ksIG5dIDwtIG1lYW4oTm9pc3kxX3BvcywgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9Ob2lzeTJfcG9zW2ksIG5dIDwtIG1lYW4oTm9pc3kyX3BvcywgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9Ob2lzeTNfcG9zW2ksIG5dIDwtIG1lYW4oTm9pc3kzX3BvcywgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9Ob2lzeTRfcG9zW2ksIG5dIDwtIG1lYW4oTm9pc3k0X3BvcywgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9Ob2lzeTVfcG9zW2ksIG5dIDwtIG1lYW4oTm9pc3k1X3BvcywgbmEucm0gPSBUUlVFKQogIH0KfQoKIyBDYWxjdWxhdGUgdGhlIG92ZXJhbGwgYXZlcmFnZSBmb3IgZWFjaCBwb3NpdGlvbiBhY3Jvc3MgYWxsIHNpbXVsYXRpb25zCm92ZXJhbGxfYXZlcmFnZV9NTV9wb3MgPC0gcm93TWVhbnMoYXZlcmFnZV9NTV9wb3MsIG5hLnJtID0gVFJVRSkKb3ZlcmFsbF9hdmVyYWdlX0luZm9ybWVkX3BvcyA8LSByb3dNZWFucyhhdmVyYWdlX0luZm9ybWVkX3BvcywgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfTm9pc3kxX3BvcyA8LSByb3dNZWFucyhhdmVyYWdlX05vaXN5MV9wb3MsIG5hLnJtID0gVFJVRSkKb3ZlcmFsbF9hdmVyYWdlX05vaXN5Ml9wb3MgPC0gcm93TWVhbnMoYXZlcmFnZV9Ob2lzeTJfcG9zLCBuYS5ybSA9IFRSVUUpCm92ZXJhbGxfYXZlcmFnZV9Ob2lzeTNfcG9zIDwtIHJvd01lYW5zKGF2ZXJhZ2VfTm9pc3kzX3BvcywgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfTm9pc3k0X3BvcyA8LSByb3dNZWFucyhhdmVyYWdlX05vaXN5NF9wb3MsIG5hLnJtID0gVFJVRSkKb3ZlcmFsbF9hdmVyYWdlX05vaXN5NV9wb3MgPC0gcm93TWVhbnMoYXZlcmFnZV9Ob2lzeTVfcG9zLCBuYS5ybSA9IFRSVUUpCgojIFBsb3QgdGhlIG92ZXJhbGwgYXZlcmFnZXMKcGxvdChvdmVyYWxsX2F2ZXJhZ2VfTU1fcG9zLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gImJsYWNrIiwgbWFpbiA9ICJPdmVyYWxsIEF2ZXJhZ2UgUG9zaXRpb24iLCB4bGFiID0gIlBvc2l0aW9uIGluIExpc3QiLCB5bGFiID0gIlZhbHVlIiwgeWxpbSA9IGMobWluKGMob3ZlcmFsbF9hdmVyYWdlX01NX3Bvcywgb3ZlcmFsbF9hdmVyYWdlX0luZm9ybWVkX3Bvcywgb3ZlcmFsbF9hdmVyYWdlX05vaXN5MV9wb3MsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeTJfcG9zLCBvdmVyYWxsX2F2ZXJhZ2VfTm9pc3kzX3Bvcywgb3ZlcmFsbF9hdmVyYWdlX05vaXN5NF9wb3MsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeTVfcG9zKSksIG1heChjKG92ZXJhbGxfYXZlcmFnZV9NTV9wb3MsIG92ZXJhbGxfYXZlcmFnZV9JbmZvcm1lZF9wb3MsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeTFfcG9zLCBvdmVyYWxsX2F2ZXJhZ2VfTm9pc3kyX3Bvcywgb3ZlcmFsbF9hdmVyYWdlX05vaXN5M19wb3MsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeTRfcG9zLCBvdmVyYWxsX2F2ZXJhZ2VfTm9pc3k1X3BvcykpKSkKbGluZXMob3ZlcmFsbF9hdmVyYWdlX0luZm9ybWVkX3BvcywgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJyZWQiKQpsaW5lcyhvdmVyYWxsX2F2ZXJhZ2VfTm9pc3kxX3BvcywgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJncmVlbiIpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV9Ob2lzeTJfcG9zLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gInllbGxvdyIpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV9Ob2lzeTNfcG9zLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gImJsdWUiKQpsaW5lcyhvdmVyYWxsX2F2ZXJhZ2VfTm9pc3k0X3BvcywgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJwdXJwbGUiKQpsaW5lcyhvdmVyYWxsX2F2ZXJhZ2VfTm9pc3k1X3BvcywgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJvcmFuZ2UiKQoKIyBBZGQgbGVnZW5kCmxlZ2VuZCgiYm90dG9tbGVmdCIsIGxlZ2VuZCA9IGMoIk1hcmtldCBNYWtlciIsICJJbmZvcm1lZCIsICJOb2lzeSAxIiwgIk5vaXN5IDIiLCAiTm9pc3kgMyIsICJOb2lzeSA0IiwgIk5vaXN5IDUiKSwgY29sID0gYygiYmxhY2siLCAicmVkIiwgImdyZWVuIiwgInllbGxvdyIsICJibHVlIiwgInB1cnBsZSIsICJvcmFuZ2UiKSwgbHR5ID0gMSwgY2V4ID0gMC44KQpgYGAKCgojIyBzZXQ3ICgxIGluZm9ybWVkICsgNSBub2lzeSBpbmZvcm1lZCkKCmBgYHtyfQojIEluaXRpYWxpemUgbWF0cmljZXMgdG8gc3RvcmUgYXZlcmFnZXMgZm9yIGVhY2ggcG9zaXRpb24KYXZlcmFnZV90cnVlIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQphdmVyYWdlX2V4cGVjdGVkIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQoKIyBMb29wIHRocm91Z2ggZWFjaCBzaW11bGF0aW9uIChuKQpmb3IgKG4gaW4gMToxMCkgewogICMgRXh0cmFjdCBUcnVlIHZhbHVlcyBmcm9tIHRoZSBhZ2dyZWdhdGVkX3Jlc3VsdHNfNCBkYXRhZnJhbWUKICBUcnVlVmFsdWVzX3NldDcgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzdbbiwgMl0pKSwgIiwgIikKICAKICAjIEV4dHJhY3QgRXhwZWN0ZWQgdmFsdWVzIGZyb20gdGhlIGFnZ3JlZ2F0ZWRfcmVzdWx0c180IGRhdGFmcmFtZQogIEV4cGVjdGVkVmFsdWVzX3NldDcgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzdbbiwgM10pKSwgIiwgIikKICAKICAjIExvb3AgdGhyb3VnaCBlYWNoIHBvc2l0aW9uIChpKQogIGZvciAoaSBpbiAxOjEwMCkgewogICAgIyBFeHRyYWN0IFRydWUgYW5kIEV4cGVjdGVkIHZhbHVlcyBmb3IgdGhlIGktdGggcG9zaXRpb24KICAgIFRydWVfdmFsdWVzIDwtIHNhcHBseShUcnVlVmFsdWVzX3NldDcsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICBFeHBlY3RlZF92YWx1ZXMgPC0gc2FwcGx5KEV4cGVjdGVkVmFsdWVzX3NldDYsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICAKICAgICMgQ2FsY3VsYXRlIHRoZSBhdmVyYWdlIG9mIFRydWUgYW5kIEV4cGVjdGVkIHZhbHVlcyBmb3IgdGhlIGktdGggcG9zaXRpb24KICAgIGF2ZXJhZ2VfdHJ1ZVtpLCBuXSA8LSBtZWFuKFRydWVfdmFsdWVzLCBuYS5ybSA9IFRSVUUpCiAgICBhdmVyYWdlX2V4cGVjdGVkW2ksIG5dIDwtIG1lYW4oRXhwZWN0ZWRfdmFsdWVzLCBuYS5ybSA9IFRSVUUpCiAgfQp9CgojIENhbGN1bGF0ZSB0aGUgb3ZlcmFsbCBhdmVyYWdlIGZvciBlYWNoIHBvc2l0aW9uIGFjcm9zcyBhbGwgc2ltdWxhdGlvbnMKb3ZlcmFsbF9hdmVyYWdlX3RydWUgPC0gcm93TWVhbnMoYXZlcmFnZV90cnVlLCBuYS5ybSA9IFRSVUUpCm92ZXJhbGxfYXZlcmFnZV9leHBlY3RlZCA8LSByb3dNZWFucyhhdmVyYWdlX2V4cGVjdGVkLCBuYS5ybSA9IFRSVUUpCgojIFBsb3QgdGhlIG92ZXJhbGwgYXZlcmFnZXMKcGxvdChvdmVyYWxsX2F2ZXJhZ2VfdHJ1ZSwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJibHVlIiwgbWFpbiA9ICJPdmVyYWxsIEF2ZXJhZ2Ugb2YgVHJ1ZSB2cyBFeHBlY3RlZCBWYWx1ZXMiLCB4bGFiID0gIlBvc2l0aW9uIGluIExpc3QiLCB5bGFiID0gIlZhbHVlIiwgeWxpbSA9IGMobWluKGMob3ZlcmFsbF9hdmVyYWdlX3RydWUsIG92ZXJhbGxfYXZlcmFnZV9leHBlY3RlZCkpLCBtYXgoYyhvdmVyYWxsX2F2ZXJhZ2VfdHJ1ZSwgb3ZlcmFsbF9hdmVyYWdlX2V4cGVjdGVkKSkpKQpsaW5lcyhvdmVyYWxsX2F2ZXJhZ2VfZXhwZWN0ZWQsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAicmVkIikKbGVnZW5kKCJ0b3ByaWdodCIsIGxlZ2VuZCA9IGMoIlRydWUgVmFsdWVzIiwgIkV4cGVjdGVkIFZhbHVlcyIpLCBjb2wgPSBjKCJibHVlIiwgInJlZCIpLCBsdHkgPSAxLCBjZXggPSAwLjgpCmBgYAoKCmBgYHtyfQojIEluaXRpYWxpemUgbWF0cmljZXMgdG8gc3RvcmUgYXZlcmFnZXMgZm9yIGVhY2ggcG9zaXRpb24KYXZlcmFnZV9iaWQgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCmF2ZXJhZ2VfYXNrIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQoKIyBMb29wIHRocm91Z2ggZWFjaCBzaW11bGF0aW9uIChuKQpmb3IgKG4gaW4gMToxMCkgewogICMgRXh0cmFjdCBUcnVlIHZhbHVlcyBmcm9tIHRoZSBhZ2dyZWdhdGVkX3Jlc3VsdHNfNCBkYXRhZnJhbWUKICBCaWRzX3NldDcgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzdbbiwgNF0pKSwgIiwgIikKICAKICAjIEV4dHJhY3QgRXhwZWN0ZWQgdmFsdWVzIGZyb20gdGhlIGFnZ3JlZ2F0ZWRfcmVzdWx0c180IGRhdGFmcmFtZQogIEFza3Nfc2V0NyA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfN1tuLCA1XSkpLCAiLCAiKQogIAogICMgTG9vcCB0aHJvdWdoIGVhY2ggcG9zaXRpb24gKGkpCiAgZm9yIChpIGluIDE6MTAwKSB7CiAgICAjIEV4dHJhY3QgVHJ1ZSBhbmQgRXhwZWN0ZWQgdmFsdWVzIGZvciB0aGUgaS10aCBwb3NpdGlvbgogICAgQmlkcyA8LSBzYXBwbHkoQmlkc19zZXQ3LCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgQXNrcyA8LSBzYXBwbHkoQXNrc19zZXQ3LCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgCiAgICAjIENhbGN1bGF0ZSB0aGUgYXZlcmFnZSBvZiBUcnVlIGFuZCBFeHBlY3RlZCB2YWx1ZXMgZm9yIHRoZSBpLXRoIHBvc2l0aW9uCiAgICBhdmVyYWdlX2JpZFtpLCBuXSA8LSBtZWFuKEJpZHMsIG5hLnJtID0gVFJVRSkKICAgIGF2ZXJhZ2VfYXNrW2ksIG5dIDwtIG1lYW4oQXNrcywgbmEucm0gPSBUUlVFKQogIH0KfQoKIyBDYWxjdWxhdGUgdGhlIG92ZXJhbGwgYXZlcmFnZSBmb3IgZWFjaCBwb3NpdGlvbiBhY3Jvc3MgYWxsIHNpbXVsYXRpb25zCm92ZXJhbGxfYXZlcmFnZV9iaWQgPC0gcm93TWVhbnMoYXZlcmFnZV9iaWQsIG5hLnJtID0gVFJVRSkKb3ZlcmFsbF9hdmVyYWdlX2FzayA8LSByb3dNZWFucyhhdmVyYWdlX2FzaywgbmEucm0gPSBUUlVFKQoKIyBQbG90IHRoZSBvdmVyYWxsIGF2ZXJhZ2VzCnBsb3Qob3ZlcmFsbF9hdmVyYWdlX2JpZCwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJibHVlIiwgbWFpbiA9ICJPdmVyYWxsIEF2ZXJhZ2Ugb2YgQmlkcyB2cyBBc2tzIiwgeGxhYiA9ICJQb3NpdGlvbiBpbiBMaXN0IiwgeWxhYiA9ICJWYWx1ZSIsIHlsaW0gPSBjKG1pbihjKG92ZXJhbGxfYXZlcmFnZV9iaWQsIG92ZXJhbGxfYXZlcmFnZV9hc2spKSwgbWF4KGMob3ZlcmFsbF9hdmVyYWdlX2JpZCwgb3ZlcmFsbF9hdmVyYWdlX2FzaykpKSkKbGluZXMob3ZlcmFsbF9hdmVyYWdlX2FzaywgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJyZWQiKQpsZWdlbmQoInRvcHJpZ2h0IiwgbGVnZW5kID0gYygiQmlkcyIsICJBc2tzIiksIGNvbCA9IGMoImJsdWUiLCAicmVkIiksIGx0eSA9IDEsIGNleCA9IDAuOCkKYGBgCgoKYGBge3J9CiMgSW5pdGlhbGl6ZSBtYXRyaWNlcyB0byBzdG9yZSBhdmVyYWdlcyBmb3IgZWFjaCBwb3NpdGlvbgphdmVyYWdlX01NX3BubCA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9JbmZvcm1lZF9wbmwgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCmF2ZXJhZ2VfTm9pc3lJbmZvcm1lZDFfcG5sIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQphdmVyYWdlX05vaXN5SW5mb3JtZWQyX3BubCA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9Ob2lzeUluZm9ybWVkM19wbmwgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCmF2ZXJhZ2VfTm9pc3lJbmZvcm1lZDRfcG5sIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQphdmVyYWdlX05vaXN5SW5mb3JtZWQ1X3BubCA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKCiMgTG9vcCB0aHJvdWdoIGVhY2ggc2ltdWxhdGlvbiAobikKZm9yIChuIGluIDE6MTApIHsKCiAgTU1fcG5sX3NldDcgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzdbbiwgNl0pKSwgIiwgIikKCiAgSW5mb3JtZWRfcG5sX3NldDcgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzdbbiwgOF0pKSwgIiwgIikKICAKICBOb2lzeUluZm9ybWVkMV9wbmxfc2V0NyA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfN1tuLCAxMF0pKSwgIiwgIikKICAKICBOb2lzeUluZm9ybWVkMl9wbmxfc2V0NyA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfN1tuLCAxMl0pKSwgIiwgIikKICAKICBOb2lzeUluZm9ybWVkM19wbmxfc2V0NyA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfN1tuLCAxNF0pKSwgIiwgIikKICAKICBOb2lzeUluZm9ybWVkNF9wbmxfc2V0NyA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfN1tuLCAxNl0pKSwgIiwgIikKICAKICBOb2lzeUluZm9ybWVkNV9wbmxfc2V0NyA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfN1tuLCAxOF0pKSwgIiwgIikKICAKICAjIExvb3AgdGhyb3VnaCBlYWNoIHBvc2l0aW9uIChpKQogIGZvciAoaSBpbiAxOjEwMCkgewogICAgIyBFeHRyYWN0IFRydWUgYW5kIEV4cGVjdGVkIHZhbHVlcyBmb3IgdGhlIGktdGggcG9zaXRpb24KICAgIE1NX3BubCA8LSBzYXBwbHkoTU1fcG5sX3NldDcsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICBJbmZvcm1lZF9wbmwgPC0gc2FwcGx5KEluZm9ybWVkX3BubF9zZXQ3LCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgTm9pc3lJbmZvcm1lZDFfcG5sIDwtIHNhcHBseShOb2lzeUluZm9ybWVkMV9wbmxfc2V0NywgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIE5vaXN5SW5mb3JtZWQyX3BubCA8LSBzYXBwbHkoTm9pc3lJbmZvcm1lZDJfcG5sX3NldDcsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICBOb2lzeUluZm9ybWVkM19wbmwgPC0gc2FwcGx5KE5vaXN5SW5mb3JtZWQzX3BubF9zZXQ3LCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgTm9pc3lJbmZvcm1lZDRfcG5sIDwtIHNhcHBseShOb2lzeUluZm9ybWVkNF9wbmxfc2V0NywgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIE5vaXN5SW5mb3JtZWQ1X3BubCA8LSBzYXBwbHkoTm9pc3lJbmZvcm1lZDVfcG5sX3NldDcsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICAKICAgICMgQ2FsY3VsYXRlIHRoZSBhdmVyYWdlIG9mIFRydWUgYW5kIEV4cGVjdGVkIHZhbHVlcyBmb3IgdGhlIGktdGggcG9zaXRpb24KICAgIGF2ZXJhZ2VfTU1fcG5sW2ksIG5dIDwtIG1lYW4oTU1fcG5sLCBuYS5ybSA9IFRSVUUpCiAgICBhdmVyYWdlX0luZm9ybWVkX3BubFtpLCBuXSA8LSBtZWFuKEluZm9ybWVkX3BubCwgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9Ob2lzeUluZm9ybWVkMV9wbmxbaSwgbl0gPC0gbWVhbihOb2lzeUluZm9ybWVkMV9wbmwsIG5hLnJtID0gVFJVRSkKICAgIGF2ZXJhZ2VfTm9pc3lJbmZvcm1lZDJfcG5sW2ksIG5dIDwtIG1lYW4oTm9pc3lJbmZvcm1lZDJfcG5sLCBuYS5ybSA9IFRSVUUpCiAgICBhdmVyYWdlX05vaXN5SW5mb3JtZWQzX3BubFtpLCBuXSA8LSBtZWFuKE5vaXN5SW5mb3JtZWQzX3BubCwgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9Ob2lzeUluZm9ybWVkNF9wbmxbaSwgbl0gPC0gbWVhbihOb2lzeUluZm9ybWVkNF9wbmwsIG5hLnJtID0gVFJVRSkKICAgIGF2ZXJhZ2VfTm9pc3lJbmZvcm1lZDVfcG5sW2ksIG5dIDwtIG1lYW4oTm9pc3lJbmZvcm1lZDVfcG5sLCBuYS5ybSA9IFRSVUUpCiAgfQp9CgojIENhbGN1bGF0ZSB0aGUgb3ZlcmFsbCBhdmVyYWdlIGZvciBlYWNoIHBvc2l0aW9uIGFjcm9zcyBhbGwgc2ltdWxhdGlvbnMKb3ZlcmFsbF9hdmVyYWdlX01NX3BubCA8LSByb3dNZWFucyhhdmVyYWdlX01NX3BubCwgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfSW5mb3JtZWRfcG5sIDwtIHJvd01lYW5zKGF2ZXJhZ2VfSW5mb3JtZWRfcG5sLCBuYS5ybSA9IFRSVUUpCm92ZXJhbGxfYXZlcmFnZV9Ob2lzeUluZm9ybWVkMV9wbmwgPC0gcm93TWVhbnMoYXZlcmFnZV9Ob2lzeUluZm9ybWVkMV9wbmwsIG5hLnJtID0gVFJVRSkKb3ZlcmFsbF9hdmVyYWdlX05vaXN5SW5mb3JtZWQyX3BubCA8LSByb3dNZWFucyhhdmVyYWdlX05vaXN5SW5mb3JtZWQyX3BubCwgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfTm9pc3lJbmZvcm1lZDNfcG5sIDwtIHJvd01lYW5zKGF2ZXJhZ2VfTm9pc3lJbmZvcm1lZDNfcG5sLCBuYS5ybSA9IFRSVUUpCm92ZXJhbGxfYXZlcmFnZV9Ob2lzeUluZm9ybWVkNF9wbmwgPC0gcm93TWVhbnMoYXZlcmFnZV9Ob2lzeUluZm9ybWVkNF9wbmwsIG5hLnJtID0gVFJVRSkKb3ZlcmFsbF9hdmVyYWdlX05vaXN5SW5mb3JtZWQ1X3BubCA8LSByb3dNZWFucyhhdmVyYWdlX05vaXN5SW5mb3JtZWQ1X3BubCwgbmEucm0gPSBUUlVFKQoKIyBQbG90IHRoZSBvdmVyYWxsIGF2ZXJhZ2VzCnBsb3Qob3ZlcmFsbF9hdmVyYWdlX01NX3BubCwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJibGFjayIsIG1haW4gPSAiT3ZlcmFsbCBBdmVyYWdlIFBOTCIsIHhsYWIgPSAiUG9zaXRpb24gaW4gTGlzdCIsIHlsYWIgPSAiVmFsdWUiLCB5bGltID0gYyhtaW4oYyhvdmVyYWxsX2F2ZXJhZ2VfTU1fcG5sLCBvdmVyYWxsX2F2ZXJhZ2VfSW5mb3JtZWRfcG5sLCBvdmVyYWxsX2F2ZXJhZ2VfTm9pc3lJbmZvcm1lZDFfcG5sLCBvdmVyYWxsX2F2ZXJhZ2VfTm9pc3lJbmZvcm1lZDJfcG5sLCBvdmVyYWxsX2F2ZXJhZ2VfTm9pc3lJbmZvcm1lZDNfcG5sLCBvdmVyYWxsX2F2ZXJhZ2VfTm9pc3lJbmZvcm1lZDRfcG5sLCBvdmVyYWxsX2F2ZXJhZ2VfTm9pc3lJbmZvcm1lZDVfcG5sKSksIG1heChjKG92ZXJhbGxfYXZlcmFnZV9NTV9wbmwsIG92ZXJhbGxfYXZlcmFnZV9JbmZvcm1lZF9wbmwsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeUluZm9ybWVkMV9wbmwsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeUluZm9ybWVkMl9wbmwsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeUluZm9ybWVkM19wbmwsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeUluZm9ybWVkNF9wbmwsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeUluZm9ybWVkNV9wbmwpKSkpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV9JbmZvcm1lZF9wbmwsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAicmVkIikKbGluZXMob3ZlcmFsbF9hdmVyYWdlX05vaXN5SW5mb3JtZWQxX3BubCwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJncmVlbiIpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV9Ob2lzeUluZm9ybWVkMl9wbmwsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAieWVsbG93IikKbGluZXMob3ZlcmFsbF9hdmVyYWdlX05vaXN5SW5mb3JtZWQzX3BubCwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJibHVlIikKbGluZXMob3ZlcmFsbF9hdmVyYWdlX05vaXN5SW5mb3JtZWQ0X3BubCwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJwdXJwbGUiKQpsaW5lcyhvdmVyYWxsX2F2ZXJhZ2VfTm9pc3lJbmZvcm1lZDVfcG5sLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gIm9yYW5nZSIpCgojIEFkZCBsZWdlbmQKbGVnZW5kKCJib3R0b21sZWZ0IiwgbGVnZW5kID0gYygiTWFya2V0IE1ha2VyIiwgIkluZm9ybWVkIiwgIk5vaXN5IEluZm9ybWVkIDEiLCAiTm9pc3kgSW5mb3JtZWQgMiIsICJOb2lzeSBJbmZvcm1lZCAzIiwgIk5vaXN5IEluZm9ybWVkIDQiLCAiTm9pc3kgSW5mb3JtZWQgNSIpLCBjb2wgPSBjKCJibGFjayIsICJyZWQiLCAiZ3JlZW4iLCAieWVsbG93IiwgImJsdWUiLCAicHVycGxlIiwgIm9yYW5nZSIpLCBsdHkgPSAxLCBjZXggPSAwLjgpCmBgYAoKYGBge3J9CiMgSW5pdGlhbGl6ZSBtYXRyaWNlcyB0byBzdG9yZSBhdmVyYWdlcyBmb3IgZWFjaCBwb3NpdGlvbgphdmVyYWdlX01NX3BvcyA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9JbmZvcm1lZF9wb3MgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCmF2ZXJhZ2VfTm9pc3lJbmZvcm1lZDFfcG9zIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQphdmVyYWdlX05vaXN5SW5mb3JtZWQyX3BvcyA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9Ob2lzeUluZm9ybWVkM19wb3MgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCmF2ZXJhZ2VfTm9pc3lJbmZvcm1lZDRfcG9zIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQphdmVyYWdlX05vaXN5SW5mb3JtZWQ1X3BvcyA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKCiMgTG9vcCB0aHJvdWdoIGVhY2ggc2ltdWxhdGlvbiAobikKZm9yIChuIGluIDE6MTApIHsKCiAgTU1fcG9zX3NldDcgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzdbbiwgN10pKSwgIiwgIikKCiAgSW5mb3JtZWRfcG9zX3NldDcgPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzdbbiwgOV0pKSwgIiwgIikKICAKICBOb2lzeUluZm9ybWVkMV9wb3Nfc2V0NyA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfN1tuLCAxMV0pKSwgIiwgIikKICAKICBOb2lzeUluZm9ybWVkMl9wb3Nfc2V0NyA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfN1tuLCAxM10pKSwgIiwgIikKICAKICBOb2lzeUluZm9ybWVkM19wb3Nfc2V0NyA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfN1tuLCAxNV0pKSwgIiwgIikKICAKICBOb2lzeUluZm9ybWVkNF9wb3Nfc2V0NyA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfN1tuLCAxN10pKSwgIiwgIikKICAKICBOb2lzeUluZm9ybWVkNV9wb3Nfc2V0NyA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfN1tuLCAxOV0pKSwgIiwgIikKICAKICAjIExvb3AgdGhyb3VnaCBlYWNoIHBvc2l0aW9uIChpKQogIGZvciAoaSBpbiAxOjEwMCkgewogICAgIyBFeHRyYWN0IFRydWUgYW5kIEV4cGVjdGVkIHZhbHVlcyBmb3IgdGhlIGktdGggcG9zaXRpb24KICAgIE1NX3BvcyA8LSBzYXBwbHkoTU1fcG9zX3NldDcsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICBJbmZvcm1lZF9wb3MgPC0gc2FwcGx5KEluZm9ybWVkX3Bvc19zZXQ3LCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgTm9pc3lJbmZvcm1lZDFfcG9zIDwtIHNhcHBseShOb2lzeUluZm9ybWVkMV9wb3Nfc2V0NywgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIE5vaXN5SW5mb3JtZWQyX3BvcyA8LSBzYXBwbHkoTm9pc3lJbmZvcm1lZDJfcG9zX3NldDcsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICBOb2lzeUluZm9ybWVkM19wb3MgPC0gc2FwcGx5KE5vaXN5SW5mb3JtZWQzX3Bvc19zZXQ3LCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgTm9pc3lJbmZvcm1lZDRfcG9zIDwtIHNhcHBseShOb2lzeUluZm9ybWVkNF9wb3Nfc2V0NywgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIE5vaXN5SW5mb3JtZWQ1X3BvcyA8LSBzYXBwbHkoTm9pc3lJbmZvcm1lZDVfcG9zX3NldDcsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICAKICAgICMgQ2FsY3VsYXRlIHRoZSBhdmVyYWdlIG9mIFRydWUgYW5kIEV4cGVjdGVkIHZhbHVlcyBmb3IgdGhlIGktdGggcG9zaXRpb24KICAgIGF2ZXJhZ2VfTU1fcG9zW2ksIG5dIDwtIG1lYW4oTU1fcG9zLCBuYS5ybSA9IFRSVUUpCiAgICBhdmVyYWdlX0luZm9ybWVkX3Bvc1tpLCBuXSA8LSBtZWFuKEluZm9ybWVkX3BvcywgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9Ob2lzeUluZm9ybWVkMV9wb3NbaSwgbl0gPC0gbWVhbihOb2lzeUluZm9ybWVkMV9wb3MsIG5hLnJtID0gVFJVRSkKICAgIGF2ZXJhZ2VfTm9pc3lJbmZvcm1lZDJfcG9zW2ksIG5dIDwtIG1lYW4oTm9pc3lJbmZvcm1lZDJfcG9zLCBuYS5ybSA9IFRSVUUpCiAgICBhdmVyYWdlX05vaXN5SW5mb3JtZWQzX3Bvc1tpLCBuXSA8LSBtZWFuKE5vaXN5SW5mb3JtZWQzX3BvcywgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9Ob2lzeUluZm9ybWVkNF9wb3NbaSwgbl0gPC0gbWVhbihOb2lzeUluZm9ybWVkNF9wb3MsIG5hLnJtID0gVFJVRSkKICAgIGF2ZXJhZ2VfTm9pc3lJbmZvcm1lZDVfcG9zW2ksIG5dIDwtIG1lYW4oTm9pc3lJbmZvcm1lZDVfcG9zLCBuYS5ybSA9IFRSVUUpCiAgfQp9CgojIENhbGN1bGF0ZSB0aGUgb3ZlcmFsbCBhdmVyYWdlIGZvciBlYWNoIHBvc2l0aW9uIGFjcm9zcyBhbGwgc2ltdWxhdGlvbnMKb3ZlcmFsbF9hdmVyYWdlX01NX3BvcyA8LSByb3dNZWFucyhhdmVyYWdlX01NX3BvcywgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfSW5mb3JtZWRfcG9zIDwtIHJvd01lYW5zKGF2ZXJhZ2VfSW5mb3JtZWRfcG9zLCBuYS5ybSA9IFRSVUUpCm92ZXJhbGxfYXZlcmFnZV9Ob2lzeUluZm9ybWVkMV9wb3MgPC0gcm93TWVhbnMoYXZlcmFnZV9Ob2lzeUluZm9ybWVkMV9wb3MsIG5hLnJtID0gVFJVRSkKb3ZlcmFsbF9hdmVyYWdlX05vaXN5SW5mb3JtZWQyX3BvcyA8LSByb3dNZWFucyhhdmVyYWdlX05vaXN5SW5mb3JtZWQyX3BvcywgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfTm9pc3lJbmZvcm1lZDNfcG9zIDwtIHJvd01lYW5zKGF2ZXJhZ2VfTm9pc3lJbmZvcm1lZDNfcG9zLCBuYS5ybSA9IFRSVUUpCm92ZXJhbGxfYXZlcmFnZV9Ob2lzeUluZm9ybWVkNF9wb3MgPC0gcm93TWVhbnMoYXZlcmFnZV9Ob2lzeUluZm9ybWVkNF9wb3MsIG5hLnJtID0gVFJVRSkKb3ZlcmFsbF9hdmVyYWdlX05vaXN5SW5mb3JtZWQ1X3BvcyA8LSByb3dNZWFucyhhdmVyYWdlX05vaXN5SW5mb3JtZWQ1X3BvcywgbmEucm0gPSBUUlVFKQoKIyBQbG90IHRoZSBvdmVyYWxsIGF2ZXJhZ2VzCnBsb3Qob3ZlcmFsbF9hdmVyYWdlX01NX3BvcywgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJibGFjayIsIG1haW4gPSAiT3ZlcmFsbCBBdmVyYWdlIFBvc2l0aW9uIiwgeGxhYiA9ICJQb3NpdGlvbiBpbiBMaXN0IiwgeWxhYiA9ICJWYWx1ZSIsIHlsaW0gPSBjKG1pbihjKG92ZXJhbGxfYXZlcmFnZV9NTV9wb3MsIG92ZXJhbGxfYXZlcmFnZV9JbmZvcm1lZF9wb3MsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeUluZm9ybWVkMV9wb3MsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeUluZm9ybWVkMl9wb3MsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeUluZm9ybWVkM19wb3MsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeUluZm9ybWVkNF9wb3MsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeUluZm9ybWVkNV9wb3MpKSwgbWF4KGMob3ZlcmFsbF9hdmVyYWdlX01NX3Bvcywgb3ZlcmFsbF9hdmVyYWdlX0luZm9ybWVkX3Bvcywgb3ZlcmFsbF9hdmVyYWdlX05vaXN5SW5mb3JtZWQxX3Bvcywgb3ZlcmFsbF9hdmVyYWdlX05vaXN5SW5mb3JtZWQyX3Bvcywgb3ZlcmFsbF9hdmVyYWdlX05vaXN5SW5mb3JtZWQzX3Bvcywgb3ZlcmFsbF9hdmVyYWdlX05vaXN5SW5mb3JtZWQ0X3Bvcywgb3ZlcmFsbF9hdmVyYWdlX05vaXN5SW5mb3JtZWQ1X3BvcykpKSkKbGluZXMob3ZlcmFsbF9hdmVyYWdlX0luZm9ybWVkX3BvcywgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJyZWQiKQpsaW5lcyhvdmVyYWxsX2F2ZXJhZ2VfTm9pc3lJbmZvcm1lZDFfcG9zLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gImdyZWVuIikKbGluZXMob3ZlcmFsbF9hdmVyYWdlX05vaXN5SW5mb3JtZWQyX3BvcywgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJ5ZWxsb3ciKQpsaW5lcyhvdmVyYWxsX2F2ZXJhZ2VfTm9pc3lJbmZvcm1lZDNfcG9zLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gImJsdWUiKQpsaW5lcyhvdmVyYWxsX2F2ZXJhZ2VfTm9pc3lJbmZvcm1lZDRfcG9zLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gInB1cnBsZSIpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV9Ob2lzeUluZm9ybWVkNV9wb3MsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAib3JhbmdlIikKCiMgQWRkIGxlZ2VuZApsZWdlbmQoImJvdHRvbWxlZnQiLCBsZWdlbmQgPSBjKCJNYXJrZXQgTWFrZXIiLCAiSW5mb3JtZWQiLCAiTm9pc3kgSW5mb3JtZWQgMSIsICJOb2lzeSBJbmZvcm1lZCAyIiwgIk5vaXN5IEluZm9ybWVkIDMiLCAiTm9pc3kgSW5mb3JtZWQgNCIsICJOb2lzeSBJbmZvcm1lZCA1IiksIGNvbCA9IGMoImJsYWNrIiwgInJlZCIsICJncmVlbiIsICJ5ZWxsb3ciLCAiYmx1ZSIsICJwdXJwbGUiLCAib3JhbmdlIiksIGx0eSA9IDEsIGNleCA9IDAuOCkKYGBgCgoKCiMjIHNldDggKDEgaW5mb3JtZWQgKyAyIG5vaXN5IGluZm9ybWVkICsgMyBub2lzeSkKCmBgYHtyfQojIEluaXRpYWxpemUgbWF0cmljZXMgdG8gc3RvcmUgYXZlcmFnZXMgZm9yIGVhY2ggcG9zaXRpb24KYXZlcmFnZV90cnVlIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQphdmVyYWdlX2V4cGVjdGVkIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQoKIyBMb29wIHRocm91Z2ggZWFjaCBzaW11bGF0aW9uIChuKQpmb3IgKG4gaW4gMToxMCkgewogICMgRXh0cmFjdCBUcnVlIHZhbHVlcyBmcm9tIHRoZSBhZ2dyZWdhdGVkX3Jlc3VsdHNfNCBkYXRhZnJhbWUKICBUcnVlVmFsdWVzX3NldDggPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzhbbiwgMl0pKSwgIiwgIikKICAKICAjIEV4dHJhY3QgRXhwZWN0ZWQgdmFsdWVzIGZyb20gdGhlIGFnZ3JlZ2F0ZWRfcmVzdWx0c180IGRhdGFmcmFtZQogIEV4cGVjdGVkVmFsdWVzX3NldDggPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzhbbiwgM10pKSwgIiwgIikKICAKICAjIExvb3AgdGhyb3VnaCBlYWNoIHBvc2l0aW9uIChpKQogIGZvciAoaSBpbiAxOjEwMCkgewogICAgIyBFeHRyYWN0IFRydWUgYW5kIEV4cGVjdGVkIHZhbHVlcyBmb3IgdGhlIGktdGggcG9zaXRpb24KICAgIFRydWVfdmFsdWVzIDwtIHNhcHBseShUcnVlVmFsdWVzX3NldDcsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICBFeHBlY3RlZF92YWx1ZXMgPC0gc2FwcGx5KEV4cGVjdGVkVmFsdWVzX3NldDYsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICAKICAgICMgQ2FsY3VsYXRlIHRoZSBhdmVyYWdlIG9mIFRydWUgYW5kIEV4cGVjdGVkIHZhbHVlcyBmb3IgdGhlIGktdGggcG9zaXRpb24KICAgIGF2ZXJhZ2VfdHJ1ZVtpLCBuXSA8LSBtZWFuKFRydWVfdmFsdWVzLCBuYS5ybSA9IFRSVUUpCiAgICBhdmVyYWdlX2V4cGVjdGVkW2ksIG5dIDwtIG1lYW4oRXhwZWN0ZWRfdmFsdWVzLCBuYS5ybSA9IFRSVUUpCiAgfQp9CgojIENhbGN1bGF0ZSB0aGUgb3ZlcmFsbCBhdmVyYWdlIGZvciBlYWNoIHBvc2l0aW9uIGFjcm9zcyBhbGwgc2ltdWxhdGlvbnMKb3ZlcmFsbF9hdmVyYWdlX3RydWUgPC0gcm93TWVhbnMoYXZlcmFnZV90cnVlLCBuYS5ybSA9IFRSVUUpCm92ZXJhbGxfYXZlcmFnZV9leHBlY3RlZCA8LSByb3dNZWFucyhhdmVyYWdlX2V4cGVjdGVkLCBuYS5ybSA9IFRSVUUpCgojIFBsb3QgdGhlIG92ZXJhbGwgYXZlcmFnZXMKcGxvdChvdmVyYWxsX2F2ZXJhZ2VfdHJ1ZSwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJibHVlIiwgbWFpbiA9ICJPdmVyYWxsIEF2ZXJhZ2Ugb2YgVHJ1ZSB2cyBFeHBlY3RlZCBWYWx1ZXMiLCB4bGFiID0gIlBvc2l0aW9uIGluIExpc3QiLCB5bGFiID0gIlZhbHVlIiwgeWxpbSA9IGMobWluKGMob3ZlcmFsbF9hdmVyYWdlX3RydWUsIG92ZXJhbGxfYXZlcmFnZV9leHBlY3RlZCkpLCBtYXgoYyhvdmVyYWxsX2F2ZXJhZ2VfdHJ1ZSwgb3ZlcmFsbF9hdmVyYWdlX2V4cGVjdGVkKSkpKQpsaW5lcyhvdmVyYWxsX2F2ZXJhZ2VfZXhwZWN0ZWQsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAicmVkIikKbGVnZW5kKCJ0b3ByaWdodCIsIGxlZ2VuZCA9IGMoIlRydWUgVmFsdWVzIiwgIkV4cGVjdGVkIFZhbHVlcyIpLCBjb2wgPSBjKCJibHVlIiwgInJlZCIpLCBsdHkgPSAxLCBjZXggPSAwLjgpCmBgYAoKYGBge3J9CiMgSW5pdGlhbGl6ZSBtYXRyaWNlcyB0byBzdG9yZSBhdmVyYWdlcyBmb3IgZWFjaCBwb3NpdGlvbgphdmVyYWdlX2JpZCA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9hc2sgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCgojIExvb3AgdGhyb3VnaCBlYWNoIHNpbXVsYXRpb24gKG4pCmZvciAobiBpbiAxOjEwKSB7CiAgIyBFeHRyYWN0IFRydWUgdmFsdWVzIGZyb20gdGhlIGFnZ3JlZ2F0ZWRfcmVzdWx0c180IGRhdGFmcmFtZQogIEJpZHNfc2V0OCA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfOFtuLCA0XSkpLCAiLCAiKQogIAogICMgRXh0cmFjdCBFeHBlY3RlZCB2YWx1ZXMgZnJvbSB0aGUgYWdncmVnYXRlZF9yZXN1bHRzXzQgZGF0YWZyYW1lCiAgQXNrc19zZXQ4IDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c184W24sIDVdKSksICIsICIpCiAgCiAgIyBMb29wIHRocm91Z2ggZWFjaCBwb3NpdGlvbiAoaSkKICBmb3IgKGkgaW4gMToxMDApIHsKICAgICMgRXh0cmFjdCBUcnVlIGFuZCBFeHBlY3RlZCB2YWx1ZXMgZm9yIHRoZSBpLXRoIHBvc2l0aW9uCiAgICBCaWRzIDwtIHNhcHBseShCaWRzX3NldDgsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICBBc2tzIDwtIHNhcHBseShBc2tzX3NldDgsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICAKICAgICMgQ2FsY3VsYXRlIHRoZSBhdmVyYWdlIG9mIFRydWUgYW5kIEV4cGVjdGVkIHZhbHVlcyBmb3IgdGhlIGktdGggcG9zaXRpb24KICAgIGF2ZXJhZ2VfYmlkW2ksIG5dIDwtIG1lYW4oQmlkcywgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9hc2tbaSwgbl0gPC0gbWVhbihBc2tzLCBuYS5ybSA9IFRSVUUpCiAgfQp9CgojIENhbGN1bGF0ZSB0aGUgb3ZlcmFsbCBhdmVyYWdlIGZvciBlYWNoIHBvc2l0aW9uIGFjcm9zcyBhbGwgc2ltdWxhdGlvbnMKb3ZlcmFsbF9hdmVyYWdlX2JpZCA8LSByb3dNZWFucyhhdmVyYWdlX2JpZCwgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfYXNrIDwtIHJvd01lYW5zKGF2ZXJhZ2VfYXNrLCBuYS5ybSA9IFRSVUUpCgojIFBsb3QgdGhlIG92ZXJhbGwgYXZlcmFnZXMKcGxvdChvdmVyYWxsX2F2ZXJhZ2VfYmlkLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gImJsdWUiLCBtYWluID0gIk92ZXJhbGwgQXZlcmFnZSBvZiBCaWRzIHZzIEFza3MiLCB4bGFiID0gIlBvc2l0aW9uIGluIExpc3QiLCB5bGFiID0gIlZhbHVlIiwgeWxpbSA9IGMobWluKGMob3ZlcmFsbF9hdmVyYWdlX2JpZCwgb3ZlcmFsbF9hdmVyYWdlX2FzaykpLCBtYXgoYyhvdmVyYWxsX2F2ZXJhZ2VfYmlkLCBvdmVyYWxsX2F2ZXJhZ2VfYXNrKSkpKQpsaW5lcyhvdmVyYWxsX2F2ZXJhZ2VfYXNrLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gInJlZCIpCmxlZ2VuZCgidG9wcmlnaHQiLCBsZWdlbmQgPSBjKCJCaWRzIiwgIkFza3MiKSwgY29sID0gYygiYmx1ZSIsICJyZWQiKSwgbHR5ID0gMSwgY2V4ID0gMC44KQpgYGAKCmBgYHtyfQojIEluaXRpYWxpemUgbWF0cmljZXMgdG8gc3RvcmUgYXZlcmFnZXMgZm9yIGVhY2ggcG9zaXRpb24KYXZlcmFnZV9NTV9wbmwgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCmF2ZXJhZ2VfSW5mb3JtZWRfcG5sIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQphdmVyYWdlX05vaXN5SW5mb3JtZWQxX3BubCA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9Ob2lzeUluZm9ybWVkMl9wbmwgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCmF2ZXJhZ2VfTm9pc3kxX3BubCA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9Ob2lzeTJfcG5sIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQphdmVyYWdlX05vaXN5M19wbmwgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCgojIExvb3AgdGhyb3VnaCBlYWNoIHNpbXVsYXRpb24gKG4pCmZvciAobiBpbiAxOjEwKSB7CgogIE1NX3BubF9zZXQ4IDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c184W24sIDZdKSksICIsICIpCgogIEluZm9ybWVkX3BubF9zZXQ4IDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c184W24sIDhdKSksICIsICIpCiAgCiAgTm9pc3lJbmZvcm1lZDFfcG5sX3NldDggPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzhbbiwgMTBdKSksICIsICIpCiAgCiAgTm9pc3lJbmZvcm1lZDJfcG5sX3NldDggPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzhbbiwgMTJdKSksICIsICIpCiAgCiAgTm9pc3kxX3BubF9zZXQ4IDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c184W24sIDE0XSkpLCAiLCAiKQogIAogIE5vaXN5Ml9wbmxfc2V0OCA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfOFtuLCAxNl0pKSwgIiwgIikKICAKICBOb2lzeTNfcG5sX3NldDggPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzhbbiwgMThdKSksICIsICIpCiAgCiAgIyBMb29wIHRocm91Z2ggZWFjaCBwb3NpdGlvbiAoaSkKICBmb3IgKGkgaW4gMToxMDApIHsKICAgICMgRXh0cmFjdCBUcnVlIGFuZCBFeHBlY3RlZCB2YWx1ZXMgZm9yIHRoZSBpLXRoIHBvc2l0aW9uCiAgICBNTV9wbmwgPC0gc2FwcGx5KE1NX3BubF9zZXQ4LCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgSW5mb3JtZWRfcG5sIDwtIHNhcHBseShJbmZvcm1lZF9wbmxfc2V0OCwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIE5vaXN5SW5mb3JtZWQxX3BubCA8LSBzYXBwbHkoTm9pc3lJbmZvcm1lZDFfcG5sX3NldDgsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICBOb2lzeUluZm9ybWVkMl9wbmwgPC0gc2FwcGx5KE5vaXN5SW5mb3JtZWQyX3BubF9zZXQ4LCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgTm9pc3kxX3BubCA8LSBzYXBwbHkoTm9pc3kxX3BubF9zZXQ4LCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgTm9pc3kyX3BubCA8LSBzYXBwbHkoTm9pc3kyX3BubF9zZXQ4LCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgTm9pc3kzX3BubCA8LSBzYXBwbHkoTm9pc3kzX3BubF9zZXQ4LCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgCiAgICAjIENhbGN1bGF0ZSB0aGUgYXZlcmFnZSBvZiBUcnVlIGFuZCBFeHBlY3RlZCB2YWx1ZXMgZm9yIHRoZSBpLXRoIHBvc2l0aW9uCiAgICBhdmVyYWdlX01NX3BubFtpLCBuXSA8LSBtZWFuKE1NX3BubCwgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9JbmZvcm1lZF9wbmxbaSwgbl0gPC0gbWVhbihJbmZvcm1lZF9wbmwsIG5hLnJtID0gVFJVRSkKICAgIGF2ZXJhZ2VfTm9pc3lJbmZvcm1lZDFfcG5sW2ksIG5dIDwtIG1lYW4oTm9pc3lJbmZvcm1lZDFfcG5sLCBuYS5ybSA9IFRSVUUpCiAgICBhdmVyYWdlX05vaXN5SW5mb3JtZWQyX3BubFtpLCBuXSA8LSBtZWFuKE5vaXN5SW5mb3JtZWQyX3BubCwgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9Ob2lzeTFfcG5sW2ksIG5dIDwtIG1lYW4oTm9pc3kxX3BubCwgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9Ob2lzeTJfcG5sW2ksIG5dIDwtIG1lYW4oTm9pc3kyX3BubCwgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9Ob2lzeTNfcG5sW2ksIG5dIDwtIG1lYW4oTm9pc3kzX3BubCwgbmEucm0gPSBUUlVFKQogIH0KfQoKIyBDYWxjdWxhdGUgdGhlIG92ZXJhbGwgYXZlcmFnZSBmb3IgZWFjaCBwb3NpdGlvbiBhY3Jvc3MgYWxsIHNpbXVsYXRpb25zCm92ZXJhbGxfYXZlcmFnZV9NTV9wbmwgPC0gcm93TWVhbnMoYXZlcmFnZV9NTV9wbmwsIG5hLnJtID0gVFJVRSkKb3ZlcmFsbF9hdmVyYWdlX0luZm9ybWVkX3BubCA8LSByb3dNZWFucyhhdmVyYWdlX0luZm9ybWVkX3BubCwgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfTm9pc3lJbmZvcm1lZDFfcG5sIDwtIHJvd01lYW5zKGF2ZXJhZ2VfTm9pc3lJbmZvcm1lZDFfcG5sLCBuYS5ybSA9IFRSVUUpCm92ZXJhbGxfYXZlcmFnZV9Ob2lzeUluZm9ybWVkMl9wbmwgPC0gcm93TWVhbnMoYXZlcmFnZV9Ob2lzeUluZm9ybWVkMl9wbmwsIG5hLnJtID0gVFJVRSkKb3ZlcmFsbF9hdmVyYWdlX05vaXN5MV9wbmwgPC0gcm93TWVhbnMoYXZlcmFnZV9Ob2lzeTFfcG5sLCBuYS5ybSA9IFRSVUUpCm92ZXJhbGxfYXZlcmFnZV9Ob2lzeTJfcG5sIDwtIHJvd01lYW5zKGF2ZXJhZ2VfTm9pc3kyX3BubCwgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfTm9pc3kzX3BubCA8LSByb3dNZWFucyhhdmVyYWdlX05vaXN5M19wbmwsIG5hLnJtID0gVFJVRSkKCiMgUGxvdCB0aGUgb3ZlcmFsbCBhdmVyYWdlcwpwbG90KG92ZXJhbGxfYXZlcmFnZV9NTV9wbmwsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAiYmxhY2siLCBtYWluID0gIk92ZXJhbGwgQXZlcmFnZSBQTkwiLCB4bGFiID0gIlBvc2l0aW9uIGluIExpc3QiLCB5bGFiID0gIlZhbHVlIiwgeWxpbSA9IGMobWluKGMob3ZlcmFsbF9hdmVyYWdlX01NX3BubCwgb3ZlcmFsbF9hdmVyYWdlX0luZm9ybWVkX3BubCwgb3ZlcmFsbF9hdmVyYWdlX05vaXN5SW5mb3JtZWQxX3BubCwgb3ZlcmFsbF9hdmVyYWdlX05vaXN5SW5mb3JtZWQyX3BubCwgb3ZlcmFsbF9hdmVyYWdlX05vaXN5MV9wbmwsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeTJfcG5sLCBvdmVyYWxsX2F2ZXJhZ2VfTm9pc3kzX3BubCkpLCBtYXgoYyhvdmVyYWxsX2F2ZXJhZ2VfTU1fcG5sLCBvdmVyYWxsX2F2ZXJhZ2VfSW5mb3JtZWRfcG5sLCBvdmVyYWxsX2F2ZXJhZ2VfTm9pc3lJbmZvcm1lZDFfcG5sLCBvdmVyYWxsX2F2ZXJhZ2VfTm9pc3lJbmZvcm1lZDJfcG5sLCBvdmVyYWxsX2F2ZXJhZ2VfTm9pc3kxX3BubCwgb3ZlcmFsbF9hdmVyYWdlX05vaXN5Ml9wbmwsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeTNfcG5sKSkpKQpsaW5lcyhvdmVyYWxsX2F2ZXJhZ2VfSW5mb3JtZWRfcG5sLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gInJlZCIpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV9Ob2lzeUluZm9ybWVkMV9wbmwsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAiZ3JlZW4iKQpsaW5lcyhvdmVyYWxsX2F2ZXJhZ2VfTm9pc3lJbmZvcm1lZDJfcG5sLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gInllbGxvdyIpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV9Ob2lzeTFfcG5sLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gImJsdWUiKQpsaW5lcyhvdmVyYWxsX2F2ZXJhZ2VfTm9pc3kyX3BubCwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJwdXJwbGUiKQpsaW5lcyhvdmVyYWxsX2F2ZXJhZ2VfTm9pc3kzX3BubCwgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJvcmFuZ2UiKQoKIyBBZGQgbGVnZW5kCmxlZ2VuZCgiYm90dG9tbGVmdCIsIGxlZ2VuZCA9IGMoIk1hcmtldCBNYWtlciIsICJJbmZvcm1lZCIsICJOb2lzeSBJbmZvcm1lZCAxIiwgIk5vaXN5IEluZm9ybWVkIDIiLCAiTm9pc3kgMyIsICJOb2lzeSA0IiwgIk5vaXN5IDUiKSwgY29sID0gYygiYmxhY2siLCAicmVkIiwgImdyZWVuIiwgInllbGxvdyIsICJibHVlIiwgInB1cnBsZSIsICJvcmFuZ2UiKSwgbHR5ID0gMSwgY2V4ID0gMC44KQpgYGAKCmBgYHtyfQojIEluaXRpYWxpemUgbWF0cmljZXMgdG8gc3RvcmUgYXZlcmFnZXMgZm9yIGVhY2ggcG9zaXRpb24KYXZlcmFnZV9NTV9wbmwgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCmF2ZXJhZ2VfSW5mb3JtZWRfcG5sIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQphdmVyYWdlX05vaXN5SW5mb3JtZWQxX3BubCA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9Ob2lzeUluZm9ybWVkMl9wbmwgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCmF2ZXJhZ2VfTm9pc3kxX3BubCA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxMDAsIG5jb2wgPSAxMCkKYXZlcmFnZV9Ob2lzeTJfcG5sIDwtIG1hdHJpeChOQSwgbnJvdyA9IDEwMCwgbmNvbCA9IDEwKQphdmVyYWdlX05vaXN5M19wbmwgPC0gbWF0cml4KE5BLCBucm93ID0gMTAwLCBuY29sID0gMTApCgojIExvb3AgdGhyb3VnaCBlYWNoIHNpbXVsYXRpb24gKG4pCmZvciAobiBpbiAxOjEwKSB7CgogIE1NX3Bvc19zZXQ4IDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c184W24sIDddKSksICIsICIpCgogIEluZm9ybWVkX3Bvc19zZXQ4IDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c184W24sIDldKSksICIsICIpCiAgCiAgTm9pc3lJbmZvcm1lZDFfcG9zX3NldDggPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzhbbiwgMTFdKSksICIsICIpCiAgCiAgTm9pc3lJbmZvcm1lZDJfcG9zX3NldDggPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzhbbiwgMTNdKSksICIsICIpCiAgCiAgTm9pc3kxX3Bvc19zZXQ4IDwtIHN0cnNwbGl0KGdzdWIoIlxcW3xcXF0iLCAiIiwgdW5saXN0KGFnZ3JlZ2F0ZWRfcmVzdWx0c184W24sIDE1XSkpLCAiLCAiKQogIAogIE5vaXN5Ml9wb3Nfc2V0OCA8LSBzdHJzcGxpdChnc3ViKCJcXFt8XFxdIiwgIiIsIHVubGlzdChhZ2dyZWdhdGVkX3Jlc3VsdHNfOFtuLCAxN10pKSwgIiwgIikKICAKICBOb2lzeTNfcG9zX3NldDggPC0gc3Ryc3BsaXQoZ3N1YigiXFxbfFxcXSIsICIiLCB1bmxpc3QoYWdncmVnYXRlZF9yZXN1bHRzXzhbbiwgMTldKSksICIsICIpCiAgCiAgIyBMb29wIHRocm91Z2ggZWFjaCBwb3NpdGlvbiAoaSkKICBmb3IgKGkgaW4gMToxMDApIHsKICAgICMgRXh0cmFjdCBUcnVlIGFuZCBFeHBlY3RlZCB2YWx1ZXMgZm9yIHRoZSBpLXRoIHBvc2l0aW9uCiAgICBNTV9wb3MgPC0gc2FwcGx5KE1NX3Bvc19zZXQ4LCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgSW5mb3JtZWRfcG9zIDwtIHNhcHBseShJbmZvcm1lZF9wb3Nfc2V0OCwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyh4W2ldKSkKICAgIE5vaXN5SW5mb3JtZWQxX3BvcyA8LSBzYXBwbHkoTm9pc3lJbmZvcm1lZDFfcG9zX3NldDgsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoeFtpXSkpCiAgICBOb2lzeUluZm9ybWVkMl9wb3MgPC0gc2FwcGx5KE5vaXN5SW5mb3JtZWQyX3Bvc19zZXQ4LCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgTm9pc3kxX3BvcyA8LSBzYXBwbHkoTm9pc3kxX3Bvc19zZXQ4LCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgTm9pc3kyX3BvcyA8LSBzYXBwbHkoTm9pc3kyX3Bvc19zZXQ4LCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgTm9pc3kzX3BvcyA8LSBzYXBwbHkoTm9pc3kzX3Bvc19zZXQ4LCBmdW5jdGlvbih4KSBhcy5udW1lcmljKHhbaV0pKQogICAgCiAgICAjIENhbGN1bGF0ZSB0aGUgYXZlcmFnZSBvZiBUcnVlIGFuZCBFeHBlY3RlZCB2YWx1ZXMgZm9yIHRoZSBpLXRoIHBvc2l0aW9uCiAgICBhdmVyYWdlX01NX3Bvc1tpLCBuXSA8LSBtZWFuKE1NX3BvcywgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9JbmZvcm1lZF9wb3NbaSwgbl0gPC0gbWVhbihJbmZvcm1lZF9wb3MsIG5hLnJtID0gVFJVRSkKICAgIGF2ZXJhZ2VfTm9pc3lJbmZvcm1lZDFfcG9zW2ksIG5dIDwtIG1lYW4oTm9pc3lJbmZvcm1lZDFfcG9zLCBuYS5ybSA9IFRSVUUpCiAgICBhdmVyYWdlX05vaXN5SW5mb3JtZWQyX3Bvc1tpLCBuXSA8LSBtZWFuKE5vaXN5SW5mb3JtZWQyX3BvcywgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9Ob2lzeTFfcG9zW2ksIG5dIDwtIG1lYW4oTm9pc3kxX3BvcywgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9Ob2lzeTJfcG9zW2ksIG5dIDwtIG1lYW4oTm9pc3kyX3BvcywgbmEucm0gPSBUUlVFKQogICAgYXZlcmFnZV9Ob2lzeTNfcG9zW2ksIG5dIDwtIG1lYW4oTm9pc3kzX3BvcywgbmEucm0gPSBUUlVFKQogIH0KfQoKIyBDYWxjdWxhdGUgdGhlIG92ZXJhbGwgYXZlcmFnZSBmb3IgZWFjaCBwb3NpdGlvbiBhY3Jvc3MgYWxsIHNpbXVsYXRpb25zCm92ZXJhbGxfYXZlcmFnZV9NTV9wb3MgPC0gcm93TWVhbnMoYXZlcmFnZV9NTV9wb3MsIG5hLnJtID0gVFJVRSkKb3ZlcmFsbF9hdmVyYWdlX0luZm9ybWVkX3BvcyA8LSByb3dNZWFucyhhdmVyYWdlX0luZm9ybWVkX3BvcywgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfTm9pc3lJbmZvcm1lZDFfcG9zIDwtIHJvd01lYW5zKGF2ZXJhZ2VfTm9pc3lJbmZvcm1lZDFfcG9zLCBuYS5ybSA9IFRSVUUpCm92ZXJhbGxfYXZlcmFnZV9Ob2lzeUluZm9ybWVkMl9wb3MgPC0gcm93TWVhbnMoYXZlcmFnZV9Ob2lzeUluZm9ybWVkMl9wb3MsIG5hLnJtID0gVFJVRSkKb3ZlcmFsbF9hdmVyYWdlX05vaXN5MV9wb3MgPC0gcm93TWVhbnMoYXZlcmFnZV9Ob2lzeTFfcG9zLCBuYS5ybSA9IFRSVUUpCm92ZXJhbGxfYXZlcmFnZV9Ob2lzeTJfcG9zIDwtIHJvd01lYW5zKGF2ZXJhZ2VfTm9pc3kyX3BvcywgbmEucm0gPSBUUlVFKQpvdmVyYWxsX2F2ZXJhZ2VfTm9pc3kzX3BvcyA8LSByb3dNZWFucyhhdmVyYWdlX05vaXN5M19wb3MsIG5hLnJtID0gVFJVRSkKCiMgUGxvdCB0aGUgb3ZlcmFsbCBhdmVyYWdlcwpwbG90KG92ZXJhbGxfYXZlcmFnZV9NTV9wb3MsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAiYmxhY2siLCBtYWluID0gIk92ZXJhbGwgQXZlcmFnZSBQb3NpdGlvbiIsIHhsYWIgPSAiUG9zaXRpb24gaW4gTGlzdCIsIHlsYWIgPSAiVmFsdWUiLCB5bGltID0gYyhtaW4oYyhvdmVyYWxsX2F2ZXJhZ2VfTU1fcG9zLCBvdmVyYWxsX2F2ZXJhZ2VfSW5mb3JtZWRfcG9zLCBvdmVyYWxsX2F2ZXJhZ2VfTm9pc3lJbmZvcm1lZDFfcG9zLCBvdmVyYWxsX2F2ZXJhZ2VfTm9pc3lJbmZvcm1lZDJfcG9zLCBvdmVyYWxsX2F2ZXJhZ2VfTm9pc3kxX3Bvcywgb3ZlcmFsbF9hdmVyYWdlX05vaXN5Ml9wb3MsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeTNfcG9zKSksIG1heChjKG92ZXJhbGxfYXZlcmFnZV9NTV9wb3MsIG92ZXJhbGxfYXZlcmFnZV9JbmZvcm1lZF9wb3MsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeUluZm9ybWVkMV9wb3MsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeUluZm9ybWVkMl9wb3MsIG92ZXJhbGxfYXZlcmFnZV9Ob2lzeTFfcG9zLCBvdmVyYWxsX2F2ZXJhZ2VfTm9pc3kyX3Bvcywgb3ZlcmFsbF9hdmVyYWdlX05vaXN5M19wb3MpKSkpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV9JbmZvcm1lZF9wb3MsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAicmVkIikKbGluZXMob3ZlcmFsbF9hdmVyYWdlX05vaXN5SW5mb3JtZWQxX3BvcywgdHlwZSA9ICJsIiwgcGNoID0gMTYsIGNvbCA9ICJncmVlbiIpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV9Ob2lzeUluZm9ybWVkMl9wb3MsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAieWVsbG93IikKbGluZXMob3ZlcmFsbF9hdmVyYWdlX05vaXN5MV9wb3MsIHR5cGUgPSAibCIsIHBjaCA9IDE2LCBjb2wgPSAiYmx1ZSIpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV9Ob2lzeTJfcG9zLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gInB1cnBsZSIpCmxpbmVzKG92ZXJhbGxfYXZlcmFnZV9Ob2lzeTNfcG9zLCB0eXBlID0gImwiLCBwY2ggPSAxNiwgY29sID0gIm9yYW5nZSIpCgojIEFkZCBsZWdlbmQKbGVnZW5kKCJib3R0b21sZWZ0IiwgbGVnZW5kID0gYygiTWFya2V0IE1ha2VyIiwgIkluZm9ybWVkIiwgIk5vaXN5IEluZm9ybWVkIDEiLCAiTm9pc3kgSW5mb3JtZWQgMiIsICJOb2lzeSAzIiwgIk5vaXN5IDQiLCAiTm9pc3kgNSIpLCBjb2wgPSBjKCJibGFjayIsICJyZWQiLCAiZ3JlZW4iLCAieWVsbG93IiwgImJsdWUiLCAicHVycGxlIiwgIm9yYW5nZSIpLCBsdHkgPSAxLCBjZXggPSAwLjgpCmBgYAoKCiMjIHNldDkKCgoKIyMgc2V0MTAKCgoKIyMgc2V0MTEKCgoKIyMgc2V0MTIKCgoKIyMgc2V0MTMKCgoKIyMgc2V0MTQKCgoKIyMgc2V0MTUKCgoKCgoKCg==